我们可以看到Collectors类包含许多常见聚合操作的工厂方法。举几个summingXXX
,averagingXXX
,maxBy
,minBy
。
这些方法实际上是与专用流上的调用方法相比的重复功能。以IntStream为例,它分别有sum()
,average()
,max()
和min()
。
同样适用于DoubleStream和LongStream。
我偶尔会看到人们可以互换地使用属于Collectors类和专用流方法的方法。
例如,假设我们有List<Employee>
并且想要获得平均工资,您可以使用专用原始流中的方法。
OptionalDouble averageUsingIntStream =
employees.stream()
.mapToInt(Employee::getSalary)
.average();
或使用Collectors
类中的工厂方法。
Double averageUsingCollectors =
employees.stream()
.collect(Collectors.averagingInt(Employee::getSalary));
现在,我的问题是这个重复功能的动机是什么,在哪种情况下使用第一种方法或第二种方法更好?
答案 0 :(得分:5)
Collectors类中所述工厂方法存在的真正动机是用作下游收集器,即Java运行时应用于另一个收集器的结果的收集器。这使得人们可以组合在一起并执行更复杂的聚合。
例如,有groupingBy个收集器接受下游收集器,collectingAndThen,partitioningBy,flatMapping(java-9)等。
因此,经验法则是仅将问题中的上述方法用作下游收集器。
专业的原始流也更有效,所以如果你想做的只是计算sum()
,average()
,max()
或min()
那么我会坚持原始专业化。