BinaryOperator 是 Java 8 提供的函数式接口,用于两个同类型输入、一个同类型输出的无副作用二元运算,支持 apply 即时计算、Stream.reduce 归约、minBy/maxBy 极值查找,并推荐使用原始类型专用接口优化性能。

BinaryOperator 是 Java 8 引入的函数式接口,专用于处理“两个同类型输入、一个同类型输出”的纯二元计算,比如加法、取较大值、字符串拼接等。它不负责遍历或状态管理,只定义“怎么把 a 和 b 合成一个 T”,必须无副作用、满足结合律。
核心用法:直接调用 apply 做即时运算
适用于简单、确定的两数(或两对象)运算,无需集合参与:
- 整数相加:BinaryOperator
add = (a, b) -> a + b; → add.apply(7, 3) 返回 10 - 取较长字符串:BinaryOperator
longer = (s1, s2) -> s1.length() >= s2.length() ? s1 : s2; → longer.apply("hi", "hello") 返回 "hello" - 自定义对象合并(如 Person 年龄求和):BinaryOperator
mergeAge = (p1, p2) -> new Person("", p1.age + p2.age);
配合 Stream.reduce 实现安全累加
这是最常见也最实用的场景——对集合做归约计算。关键点是必须提供初始值,避免空集合抛 NoSuchElementException:
- 整型列表求和:list.stream().reduce(0, Integer::sum) 或 (a, b) -> a + b
- 双精度浮点累加:doubleList.stream().reduce(0.0, Double::sum)(注意用 0.0,不是 0)
- 空集合也不报错:传入 Collections.emptyList(),结果仍是初始值 0 或 0.0
配合 minBy / maxBy 快速获取极值
BinaryOperator 提供了两个静态工厂方法,免去手写比较逻辑:
- 找最大值:BinaryOperator
max = BinaryOperator.maxBy(Comparator.naturalOrder()); - 找最小字符串(按长度):BinaryOperator
shortest = BinaryOperator.minBy(Comparator.comparing(String::length)); - 它们本质是封装好的 lambda,可直接用于 reduce:stream.reduce(shortest).orElse(null)
注意类型匹配与性能优化
别让泛型擦除或装箱拖慢性能:
- 纯 int 运算优先用 IntBinaryOperator(如 (a, b) -> a * b),避免 Integer 自动装箱
- Double/Long 同理,选 DoubleBinaryOperator 或 LongBinaryOperator
- 混用数值类型时(如字段含 int/double/BigDecimal),先统一转为 Number,再用 (a, b) -> a.doubleValue() + b.doubleValue()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











