BinaryOperator仅定义同类型值的合并规则,不执行计算;需通过apply()手动调用或配合Stream.reduce、Arrays.parallelPrefix等API使用,且必须满足无副作用、结合律及类型一致等约束。

BinaryOperator 本身不“实现计算”,它只定义两个同类型值怎么合并——比如 a + b 或 Math.max(a, b)。真正执行计算,需要把它用在具体场景中,比如调用 apply() 方法手动算一次,或配合 Stream、Arrays 等 API 做批量处理。
直接调用 apply() 手动计算
最基础的用法:创建一个 BinaryOperator 实例,传两个参数,立刻得到结果。
-
整数相加:
BinaryOperator<integer> add = (a, b) -> a + b;</integer>,然后add.apply(7, 3)返回10 -
字符串选长的:
BinaryOperator<string> longer = (s1, s2) -> s1.length() >= s2.length() ? s1 : s2;</string>,longer.apply("hi", "hello")返回"hello" -
取最小值(用内置静态方法):
BinaryOperator<integer> min = BinaryOperator.minBy(Integer::compareTo);</integer>,min.apply(8, 2)返回2
配合 Stream.reduce 做集合累加
这是最实用的场景:把列表所有元素按规则“合并”成一个结果。
- 必须提供初始值(如
0),否则空集合会抛异常 - 推荐用方法引用,简洁且语义清晰:
Integer::sum、Double::sum、String::concat - 示例:
List<double> ds = Arrays.asList(1.5, 2.3, 0.2);</double>double total = ds.stream().reduce(0.0, Double::sum); // 得到 4.0
配合 Arrays.parallelPrefix 做前缀累积
适合对数组做“逐步叠加”,比如生成前缀和数组:
立即学习“Java免费学习笔记(深入)”;
int[] arr = {1, 2, 3, 4};Arrays.parallelPrefix(arr, Integer::sum);- 执行后
arr变成{1, 3, 6, 10}—— 每个位置是前面所有数的和 - 注意:该操作直接修改原数组,不是纯函数式,但 BinaryOperator 逻辑本身仍需无副作用
注意事项:别踩这些坑
BinaryOperator 的行为直接影响结果正确性,尤其在并行环境下:
- 不能修改入参对象,比如在 lambda 里往 List 里 add 元素
- 不能有外部依赖或副作用,例如打印日志、读文件、改全局变量
- 必须满足结合律:
op(op(a,b),c) == op(a,op(b,c));加法、乘法、Math.max都行,但减法、除法不行 - 类型要严格一致:用
BinaryOperator<integer></integer>处理Long会编译失败


















