Collectors.maxBy()和 minBy()
Java 8
流的新类java.util.stream.Collectors
实现了java.util.stream.Collector
接口,同时又提供了大量的方法对流 (stream
) 的元素执行map
and
reduce
操作,或者统计操作。
Collectors
中的maxBy
& minBy
这两个函数和lambda
中的max
&min
作用相同
maxByAndMinByExample代码
@Test
public void maxByAndMinByExample() {
List<String> list = Arrays.asList("1", "2", "3", "4");
Optional<String> max = list.stream().collect(Collectors.maxBy((s, v) -> s.compareTo(v)));
Optional<String> min = list.stream().collect(Collectors.minBy((s, v) -> s.compareTo(v)));
System.out.println(max.get());
System.out.println(min.get());
}
maxByAndMinByExample结果
4
1
maxAndMinExample代码
@Test
public void maxAndMinExample() {
List<String> list = Arrays.asList("1", "2", "3", "4");
Optional<String> max = list.stream().max((s, v) -> s.compareTo(v));
Optional<String> min = list.stream().min((s, v) -> s.compareTo(v));
System.out.println(max.get());
System.out.println(min.get());
}
maxAndMinExample结果
4
1
注意:
-
经过对比发现,直接使用
man
|min
代码会更简洁、易读 -
值得一提的是
max
&min
&maxBy
&minBy
中所需要的表达式【Comparator
比较器】-
代码中是使用语法糖的形式写的
-
其中定义的是两个值的比较,也可以自己写比较器进行调用
-
public static <T> Collector<T, ?, Optional<T>> minBy(Comparator<? super T> comparator) { return reducing(BinaryOperator.minBy(comparator)); }
-
因为可以自定义比较器,所以
max
&min
&maxBy
&minBy
中的参数是不限制的,不像Joining
函数仅限于String
-
一点唠叨:
- 相对于
Collectors.averagingDouble()
来说,方法体只执行一次。 - 相对于
Collectors.averagingDouble()
来说,方法体做出了优化 - 相对于
Collectors.averagingDouble()
来说,这个没有坑 - ……
- 为什么这么提
Collectors.averagingDouble()
,最好看一下—> averagingDouble - 因为
Collectors.averagingDouble()
有坑,有坑,有坑