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

标签 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();

或者使用 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/

相关文章:

java - 在 Java 8 中使用先前链接的 thenCompose lambda 的值

java - 使用 listener 和 DoubleProperty 获取变化量

java - 混合 Java 流 + Rxjava 安全吗

java - 尝试查找元素时如何使用列表上的流抛出异常?

Java流过滤器值的总和

java - 将每行一张图像添加到 JPanel

java - 带有条件代码的错误(如果)

java - Text.getBytes() 返回意外结果

Java 语句对象重用?

multithreading - 克隆/复制 SimpleScriptContext