我们可以看到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));
现在,我的问题是这种重复功能背后的动机是什么?在什么情况下使用第一种方法或第二种方法更好?
最佳答案
Collectors 类中存在上述工厂方法的真正动机是用作下游收集器,即 Java 运行时将其应用于另一个收集器的结果的收集器。这使得人们能够组合在一起并执行更复杂的聚合。
例如有groupingBy接受下游收集器的收集器,collectingAndThen , partitioningBy , flatMapping (java-9)等。
因此,经验法则是仅使用问题中的上述方法作为下游收集器。
专用的原始流也更高效,因此如果您只想计算 sum()
、average()
、max()
或 min()
那么我会坚持原始特化。
关于java - 何时使用专门的流方法而不是 Collectors 类中的方法,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49965753/