0%

stream and lambda(13) - 终止操作之计数 count 与比较 min、max

在 Stream 的终止操作中,有几个关于聚合的方法,包括计数、最小最大值取值。

计数 count

long count();

注意了,Stream 不是集合,不能再用 size() 来计算元素个数了。

1
2
3
4
public void countTest() {
long count = Stream.of(1, 1, 2, 2, 3).count();
System.out.println(count);
}

比较 min、max

Optional<T> min(Comparator<? super T> comparator);
Optional<T> max(Comparator<? super T> comparator);

minmax 一眼看上去老熟悉了,毕竟我们讲过多次比较器了。这两个方法根据传入的比较器来判断两个对象之间的大小,从而确定最小最大值。

1
2
3
4
5
6
7
public void minMaxTest() {
Optional<Integer> min = Stream.of(1, 2, 3, 4, 5).min(Comparator.naturalOrder());
System.out.println(min.get());

Optional<Integer> max = Stream.of(1, 2, 3, 4, 5).max(Comparator.naturalOrder());
System.out.println(max.get());
}

此处返回的是 Optional,本例因为确定有值,所以直接使用 get 方法。

试想一下,传统 for 循环来自己求最大最小值有多少代码要写?判断非空、循环、首元素赋值、比较并重新赋值,经过这么多固定步骤才可以得到我们想要的最大最小值。现在,你需要一行代码。不要998,也不要98,1块钱就可以带回家。

总结

  • countminmax 三个方法使用起来还是比较简单的,基本上是看了 API 就能上手。
  • minmax 返回的是 Optional,如果是一个空的 Stream,是没有最大或最小值的,取值时注意尽量避免 Optional.get

注:本文配套代码可在 github 查看:stream-and-lambda