BiFunction 是 Java 8 引入的函数式接口,接收两个参数并返回一个结果,核心方法为 apply(T t, U u),支持 Lambda 表达式、方法引用和匿名内部类实现,并提供 andThen 链式操作。

BiFunction 是 Java 8 引入的函数式接口,位于 java.util.function 包中,专为“接收两个参数、返回一个结果”的场景设计。它有三个泛型参数:T(第一个输入类型)、U(第二个输入类型)、R(返回类型),核心方法是 R apply(T t, U u)。
定义 BiFunction 实例的三种常用方式
你可以用 Lambda 表达式、方法引用或匿名内部类来实现,但 Lambda 最简洁直观:
-
Lambda 表达式(推荐):直接写出逻辑,类型由编译器推断
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b; -
方法引用(适合已有静态/实例方法)
BiFunction<String, String, String> concat = String::concat;
(注意:String::concat 接收一个参数,但它是实例方法,调用时隐式使用第一个 String 作为调用对象,所以适配 BiFunction<String,String,String>) -
匿名内部类(不常用,仅作了解)
BiFunction<Double, Double, Double> max = new BiFunction<>() {
@Override
public Double apply(Double a, Double b) { return Math.max(a, b); }
};
执行算法:调用 apply() 方法
定义后,直接调用 apply(t, u) 即可运行逻辑,无需额外包装:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- int result = add.apply(3, 5); // 返回 8
- String s = concat.apply("Hello", " World"); // 返回 "Hello World"
- 支持链式操作:BiFunction 提供
andThen()方法,将当前结果作为下一个函数的输入
BiFunction<Integer, Integer, Integer> addThenSquare = add.andThen(x -> x * x);
int r = addThenSquare.apply(2, 3); // 先 2+3=5,再 5*5=25
实际应用场景举例
BiFunction 特别适合封装二元运算、数据合并、策略组合等逻辑:
立即学习“Java免费学习笔记(深入)”;
-
数据库查询条件组装:
BiFunction<String, Integer, User> findUserByNameAndAge = (name, age) -> userRepository.findByNameAndAge(name, age); -
Map 的 merge 操作(如
Map.merge(key, value, BiFunction)):
map.merge("key", 1, (oldVal, newVal) -> oldVal + newVal); // 冲突时相加 -
自定义比较或转换逻辑:
BiFunction<LocalDateTime, ZoneId, ZonedDateTime> toZoned = (dt, zone) -> dt.atZone(zone);
注意事项与技巧
使用时需注意类型匹配与空值安全:
- 泛型类型必须明确或可推断,避免原始类型导致编译错误
- Lambda 中若涉及可能为 null 的参数,建议主动判空,BiFunction 本身不处理 null
- 如需抛出受检异常,需自行封装(例如用自定义函数接口或 try-catch 包裹)
- 多个 BiFunction 可组合使用,比如用
andThen构建处理流水线,提升可读性

















