BinaryOperator 接口不提供 maxBy 或 minBy 方法,这两个静态方法定义在 Comparator 中,返回 BinaryOperator 实例用于 Stream 的 reduce 或 collect 操作求极值。

BinaryOperator 接口本身并不提供 maxBy 或 minBy 方法 —— 这两个方法实际定义在 java.util.Comparator 中,是静态工厂方法,返回的是 BinaryOperator<t></t> 实例,用于在流(Stream)的 reduce 或 collect 操作中求极值。
maxBy 和 minBy 是 Comparator 的静态方法
它们不属 BinaryOperator 接口,而是 Comparator 提供的便捷工具:
-
Comparator.maxBy(Comparator<T>):返回一个BinaryOperator<t></t>,它接收两个元素,返回按比较器判定“更大”的那个; -
Comparator.minBy(Comparator<T>):同理,返回“更小”的那个。
返回的 BinaryOperator 符合 (T, T) → T 签名,因此可直接传给 Stream.reduce()。
典型用法:配合 reduce 获取极值对象
比如对 Person 列表按年龄取最大者:
立即学习“Java免费学习笔记(深入)”;
List<Person> people = List.of(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
Optional<Person> oldest = people.stream()
.reduce(Comparator.maxBy(Comparator.comparingInt(Person::getAge)));
// 结果为 Optional[Person{name='Charlie', age=35}]
注意:reduce 返回 Optional<T>,因为流可能为空;若确定非空,可用 orElseThrow() 安全解包。
与 Collectors.maxBy / minBy 的区别
Collectors.maxBy 和 Collectors.minBy 功能类似,但用于 collect():
- 语义更清晰:明确表达“收集最大/最小元素”;
- 内部同样使用
Comparator.maxBy/minBy构建的BinaryOperator; - 推荐优先使用
Collectors.maxBy,代码意图更直观:
Optional<Person> oldest = people.stream()
.collect(Collectors.maxBy(Comparator.comparingInt(Person::getAge)));
注意事项
- 返回的
BinaryOperator是无状态、线程安全的,适合并行流; - 比较器不能为
null,否则抛NullPointerException; - 若比较结果相等(
compare(a,b)==0),maxBy任意返回其一(稳定但不保证具体选哪个); - 不要误以为
BinaryOperator自带maxBy—— 编译会报错,必须从Comparator调用。


















