何时使用专门的流方法而不是Collectors类中的方法,反之亦然?

时间:2018-04-22 12:11:51

标签: java java-8 java-stream

我们可以看到Collectors类包含许多常见聚合操作的工厂方法。举几个summingXXXaveragingXXXmaxByminBy

这些方法实际上是与专用流上的调用方法相比的重复功能。以IntStream为例,它分别有sum()average()max()min()

同样适用于DoubleStreamLongStream

我偶尔会看到人们可以互换地使用属于Collectors类和专用流方法的方法。

例如,假设我们有List<Employee>并且想要获得平均工资,您可以使用专用原始流中的方法。

OptionalDouble averageUsingIntStream =
             employees.stream()
                      .mapToInt(Employee::getSalary)
                      .average();

或使用Collectors类中的工厂方法。

Double averageUsingCollectors =
             employees.stream()
                      .collect(Collectors.averagingInt(Employee::getSalary));

现在,我的问题是这个重复功能的动机是什么,在哪种情况下使用第一种方法或第二种方法更好?

1 个答案:

答案 0 :(得分:5)

Collectors类中所述工厂方法存在的真正动机是用作下游收集器,即Java运行时应用于另一个收集器的结果的收集器。这使得人们可以组合在一起并执行更复杂的聚合。

例如,有groupingBy个收集器接受下游收集器,collectingAndThenpartitioningByflatMapping(java-9)等。

因此,经验法则是仅将问题中的上述方法用作下游收集器。

专业的原始流也更有效,所以如果你想做的只是计算sum()average()max()min()那么我会坚持原始专业化。