Ous*_* D. 3 java java-8 java-stream
我们可以看到Collectors类包含许多常见聚合操作的工厂方法.仅举几例 summingXXX,averagingXXX,maxBy,minBy.
这些方法实际上是与专用流上的调用方法相比的重复功能.采取例如IntStream,这有一个sum(), average(),max()和min()分别.
这同样适用于DoubleStream和LongStream.
我不时地看到人们使用属于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)
现在,我的问题是这个重复功能背后的动机是什么,在哪种情况下使用第一种方法或第二种方法更好?
Collectors类中存在的所述工厂方法的真正动机是用作下游收集器,即Java运行时应用于另一个收集器的结果的收集器.这使得人们可以组合在一起并执行更复杂的聚合.
例如,有groupingBy收集器接受下游收集器,collectionsAndThen,partitioningBy,flatMapping(java-9)等.
因此,经验法则是仅将问题中的上述方法用作下游收集器.
专业的原始流也更有效,所以如果你想要做的是计算sum(), average(),max()还是min()那么我会用原始的专业化棒.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |