BiFunction示例

在Java8中,BiFunction是函数接口,它接收两个实参,返回一个对象

BiFunction.java

@FunctionalInterface
public interface BiFunction<T, U, R> {R apply(T t, U u);}
  • T——function第一个实参的类型
  • U——function第二个实参的类型
  • R——function返回的结果类型

BiFunction<T, U, R>

下面这个示例演示了接收两个Integer参数,返回Integer、Double或List

import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;public class Java8BiFunction1 {public static void main(String[] args) {// takes two Integers and return an IntegerBiFunction<Integer, Integer, Integer> func = (x1, x2) -> x1 + x2;Integer result = func.apply(2, 3);System.out.println(result); // 5// take two Integers and return an DoubleBiFunction<Integer, Integer, Double> func2 = (x1, x2) -> Math.pow(x1, x2);Double result2 = func2.apply(2, 4);System.out.println(result2);    // 16.0// take two Integers and return a List<Integer>BiFunction<Integer, Integer, List<Integer>> func3 = (x1, x2) -> Arrays.asList(x1 + x2);List<Integer> result3 = func3.apply(2, 3);System.out.println(result3);}}

输出

5
16.0
[5]

BiFunction<T, U, R>和Function<T, R>

BiFunction需要两个Integer参数,返回返回一个double,接着使用andThen()链接它给Function,将Double转化为String

import java.util.function.BiFunction;
import java.util.function.Function;public class Java8BiFunction2a {public static void main(String[] args) {// Math.pow(a1, a2) returns DoubleBiFunction<Integer, Integer, Double> func1 = (a1, a2) -> Math.pow(a1, a2);// takes Double, returns StringFunction<Double, String> func2 = (input) -> "Result : " + String.valueOf(input);String result = func1.andThen(func2).apply(2, 4);System.out.println(result);}
}

输出

Result : 16.0

下面这个示例将上面程序转换为一个方法,接收BiFunction和Function作为参数,并将它们链接在一起

import java.util.function.BiFunction;
import java.util.function.Function;public class Java8BiFunction2b {public static void main(String[] args) {String result = powToString(2, 4,(a1, a2) -> Math.pow(a1, a2),(r) -> "Result : " + String.valueOf(r));System.out.println(result); // Result : 16.0}public static <R> R powToString(Integer a1, Integer a2,BiFunction<Integer, Integer, Double> func,Function<Double, R> func2) {return func.andThen(func2).apply(a1, a2);}
}

输出

Result : 16.0

下面示例将上述方法转化为一个通用方法

public static <A1, A2, R1, R2> R2 convert(A1 a1, A2 a2,BiFunction<A1, A2, R1> func,Function<R1, R2> func2) {return func.andThen(func2).apply(a1, a2);
}

下面这个示例展示了这个通用方法的许多可能性:

import java.util.function.BiFunction;
import java.util.function.Function;public class Java8BiFunction2c {public static void main(String[] args) {// Take two Integers, pow it into a Double, convert Double into a String.String result = convert(2, 4,(a1, a2) -> Math.pow(a1, a2),(r) -> "Pow : " + String.valueOf(r));System.out.println(result);     // Pow : 16.0// Take two Integers, multiply into an Integer, convert Integer into a String.String result2 = convert(2, 4,(a1, a2) -> a1 * a1,(r) -> "Multiply : " + String.valueOf(r));System.out.println(result2);    // Multiply : 4// Take two Strings, join both, join "cde"String result3 = convert("a", "b",(a1, a2) -> a1 + a2,(r) -> r + "cde");      // abcdeSystem.out.println(result3);// Take two Strings, join both, convert it into an IntegerInteger result4 = convert("100", "200",(a1, a2) -> a1 + a2,(r) -> Integer.valueOf(r));System.out.println(result4);    // 100200}public static <A1, A2, R1, R2> R2 convert(A1 a1, A2 a2,BiFunction<A1, A2, R1> func,Function<R1, R2> func2) {return func.andThen(func2).apply(a1, a2);}}

输出

Pow : 16.0
Multiply : 4
abcde
100200

Factory

下面示例展示了使用BiFunction创建一个对象,类似工厂模式

import java.util.function.BiFunction;public class Java8BiFunction3 {public static void main(String[] args) {GPS obj = factory("40.741895", "-73.989308", GPS::new);System.out.println(obj);}public static <R extends GPS> R factory(String Latitude, String Longitude,BiFunction<String, String, R> func) {return func.apply(Latitude, Longitude);}}class GPS {String Latitude;String Longitude;public GPS(String latitude, String longitude) {Latitude = latitude;Longitude = longitude;}public String getLatitude() {return Latitude;}public void setLatitude(String latitude) {Latitude = latitude;}public String getLongitude() {return Longitude;}public void setLongitude(String longitude) {Longitude = longitude;}@Overridepublic String toString() {return "GPS{" +"Latitude='" + Latitude + '\'' +", Longitude='" + Longitude + '\'' +'}';}
}

输出

GPS{Latitude='40.741895', Longitude='-73.989308'}

GPS::new调用下面的这个构造函数,它接收两个参数,返回一个GPS对象。

 public GPS(String latitude, String longitude) {Latitude = latitude;Longitude = longitude;}

更多示例

通过一些条件过滤List

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;public class Java8BiFunction4 {public static void main(String[] args) {Java8BiFunction4 obj = new Java8BiFunction4();List<String> list = Arrays.asList("node", "c++", "java", "javascript");List<String> result = obj.filterList(list, 3, obj::filterByLength);System.out.println(result);   // [node, java, javascript]List<String> result1 = obj.filterList(list, 3, (l1, size) -> {if (l1.length() > size) {return l1;} else {return null;}});System.out.println(result1);  // [node, java, javascript]List<String> result2 = obj.filterList(list, "c", (l1, condition) -> {if (l1.startsWith(condition)) {return l1;} else {return null;}});System.out.println(result2);  // [c++]List<Integer> number = Arrays.asList(1, 2, 3, 4, 5);List<Integer> result3 = obj.filterList(number, 2, (l1, condition) -> {if (l1 % condition == 0) {return l1;} else {return null;}});System.out.println(result3);  // [2, 4]}public String filterByLength(String str, Integer size) {if (str.length() > size) {return str;} else {return null;}}public <T, U, R> List<R> filterList(List<T> list1, U condition,BiFunction<T, U, R> func) {List<R> result = new ArrayList<>();for (T t : list1) {R apply = func.apply(t, condition);if (apply != null) {result.add(apply);}}return result;}
}

输出

[node, java, javascript]
[node, java, javascript]
[c++]
[2, 4]

BiFunction示例相关推荐

  1. 运营微信公众号个人号面临的各种问题(写给2021年想开始公众号运营的身边)

    微信公众号发布后无法反复修改 微信公众号不适合写博客,一旦发布就基本无法修改,文字只能改个位数的字,图片直接无法改,出现无法容忍的错误,只能删除全文 微信公众号文章无法添加微信以外的跳转超链接 微信公 ...

  2. java 接口 this参数_Java BiFunction 接口实例

    原标题:Java BiFunction 接口实例 www.baeldung.com/java-bifunction-interface 1. 简介 Java8 引入了函数式编程,可以把函数作为参数传入 ...

  3. java散列法的运用实例,Java HashMap compute() 使用方法及示例

    Java HashMap compute() 使用方法及示例 Java HashMap compute()方法计算一个新值,并将其与哈希映射中的指定键相关联. compute()方法的语法为: has ...

  4. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

    java 函数式编程 示例 这是第8部分,该系列的最后一部分称为"示例功能Java". 我在本系列的每个部分中开发的示例是某种"提要处理程序",用于处理文档. ...

  5. java方法示例注释 @_Java 8中的功能接口是什么? @功能注释和示例

    java方法示例注释 @ 函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习l ...

  6. functor_纯Java中的Functor和Monad示例

    functor 本文最初是我们使用RxJava进行React式编程的附录. 但是,尽管与React式编程非常相关,但对monad的介绍却不太适合. 因此,我决定将其取出并作为博客文章单独发布. 我知道 ...

  7. 功能Java示例 第8部分–更多纯函数

    这是第8部分,该系列的最后一部分称为" Functional Java by Example". 我在本系列的每个部分中发展的示例是某种"提要处理程序",用于处 ...

  8. Java 8中的功能接口是什么? @功能注释和示例

    函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习lambda表达式和Stre ...

  9. 纯Java中的Functor和Monad示例

    本文最初是我们使用RxJava进行反应式编程的附录. 但是,尽管与反应式编程非常相关,但对monad的介绍却不太适合. 因此,我决定将其取出并作为博客文章单独发布. 我知道," 我自己的,对 ...

最新文章

  1. 分库分表之后,主键的处理方法
  2. 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码
  3. 2019年IT人加薪的9大神器
  4. mysql多行合并成一行_数据文件合并与拆分
  5. c++ error函数_R语言中广义线性模型(GLM)中的分布和连接函数分析
  6. HTML中的camera标签,详解HTML5 使用video标签实现选择摄像头功能
  7. 聊聊JVM(九)理解进入safepoint时如何让Java线程全部阻塞
  8. oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)...
  9. jenkins pipeline之如何创建一个流水线
  10. Java小开发(车辆信息管理系统)
  11. Windows10系统迁移
  12. 虚拟机查看HWADDR(即MAC)地址
  13. oracle现金流量表逻辑,分析现金流量表填列法的逻辑
  14. 海外短视频月活1.5亿,欢聚时代拿稳全球短视频入场券?
  15. python 实现维基百科六度分隔原理
  16. Struts2远程命令执行漏洞
  17. Palantir Gothan 的SWOT 分析
  18. pscs6安装序列号
  19. 软考计算机英语词汇,软考计算机专业英语常用词汇(字母D-E)
  20. mysql已启动但无法连接_MySQL无法正常启动,Navicat连接出错,解决2003问题

热门文章

  1. 问题解决:AttributeError: ‘NoneType‘ object has no attribute ‘get‘
  2. 莫顿码Morton code的c语言实现
  3. 阿豪学习之:使用xshell连接linux
  4. 物联lot是什么意思_产品上的LOT是什么意思?
  5. 824. 山羊拉丁文(模拟)
  6. Datawhale 9月份学习笔记一之 图解Attention
  7. Gamma的完全理解
  8. java中的字符个数,增补字符
  9. JVM监控篇(三)- JVM监控方案之prometheus+k8s+influxdb
  10. 如何使用别人的github.io 博客模板