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

Ous*_* D. 3 java java-8 java-stream

我们可以看到Collectors类包含许多常见聚合操作的工厂方法.仅举几例 summingXXX,averagingXXX,maxBy,minBy.

这些方法实际上是与专用流上的调用方法相比的重复功能.采取例如IntStream,这有一个sum(), average(),max()min()分别.

这同样适用于DoubleStreamLongStream.

我不时地看到人们使用属于Collectors类的方法和专门的流方法可以互换.

例如,假设我们有一个List<Employee>人想要获得平均工资,你可以使用专用原始流中的方法.

OptionalDouble averageUsingIntStream =
             employees.stream()
                      .mapToInt(Employee::getSalary)
                      .average();
Run Code Online (Sandbox Code Playgroud)

或者在Collectors课堂上使用工厂方法.

Double averageUsingCollectors =
             employees.stream()
                      .collect(Collectors.averagingInt(Employee::getSalary));
Run Code Online (Sandbox Code Playgroud)

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

Ous*_* D. 6

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

例如,有groupingBy收集器接受下游收集器,collectionsAndThen,partitioningBy,flatMapping(java-9)等.

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

专业的原始流也更有效,所以如果你想要做的是计算sum(), average(),max()还是min()那么我会用原始的专业化棒.

  • @daniu 是的,这就是意图,但非常欢迎任何人添加自己的答案并_分享知识_。 (2认同)