BiFunction 是 Java 8 提供的双参数单返回值函数式接口,定义为 BiFunction<T, U, R>,含唯一抽象方法 R apply(T t, U u),适用于双输入计算、类型转换、Stream/Optional 组合及 null 安全处理。

BiFunction 是 Java 8 引入的函数式接口,专门用于接收两个参数、返回一个结果的场景,非常适合处理需要“双输入→单输出”的业务计算或类型转换。
理解 BiFunction 的签名和基本用法
它的定义是:BiFunction<t u r></t>,其中 T 和 U 是两个输入类型,R 是返回类型。它只有一个抽象方法:R apply(T t, U u)。
比如把订单金额和折扣率组合计算实付金额:
BiFunction<BigDecimal, BigDecimal, BigDecimal> calculateActualAmount =
(amount, discountRate) -> amount.multiply(BigDecimal.ONE.subtract(discountRate));
BigDecimal actual = calculateActualAmount.apply(new BigDecimal("100.00"), new BigDecimal("0.1")); // 90.00
在业务逻辑中做类型转换与组合
当两个不同来源的数据(如 DTO + 配置、ID + 缓存对象)需联合生成新结构时,BiFunction 很自然:
立即学习“Java免费学习笔记(深入)”;
- 传入用户 ID(String)和用户详情 Map(Map
),查出 User 并封装成响应 VO - 接收原始字符串和格式化模板(如 "yyyy-MM-dd"),返回格式化后的 LocalDate 或 String
- 将 HTTP 请求头(Map)和请求体(Object)一起校验并组装成上下文 Context 对象
配合 Stream 和 Optional 提升可读性
在集合处理中,常与 Stream.collect() 或 Optional.map() 结合使用:
- 用
Collectors.toMap(keyMapper, valueMapper, mergeFunction)时,第三个参数就是BiFunction,用于解决 key 冲突 -
Optional<String> id = ...; Optional<User> user = ...;可用id.flatMap(i -> user.map(u -> buildFullName(i, u))),而buildFullName就可定义为BiFunction<String, User, String>
注意 null 安全与异常处理
BiFunction 不声明抛出受检异常,所以业务中若涉及 IO 或可能空值,建议提前防护:
- 用 Objects.requireNonNull() 包裹关键参数,避免运行时 NPE
- 把可能抛异常的逻辑包装在 try-catch 中,转为返回 Optional 或默认值
- 避免在 lambda 里写复杂逻辑;提取为命名方法更利于测试和复用,例如:
(a, b) -> computeWithValidation(a, b)


















