java - 流收集与 map 收集

标签 java java-8 java-stream

Stream 中有一些方法,特别是在处理可以这样或那样写的数值时。 (同样的问题适用于 average())

那么哪种方法更可取:

DoubleSummaryStatistics result;

result = stream()
        .collect( Collectors.summarizingDouble( weighter::weight ) );

对比

result = stream()
        .mapToDouble( weighter::weight )
        .summaryStatistics();

为什么?

(如我所见,第一个的优点是每个元素只“访问”一次,而第二个具有更清晰的语义,但至少访问每个元素两次。但这是否重要/正确?)

最佳答案

在性能方面,似乎第二种方法(映射然后总结)比第一种方法(使用收集器)更快:

Benchmark                         (n)  Mode  Samples     Score     Error  Units
c.a.p.SO26775395.collector         10  avgt       10     0.110 ±   0.004  us/op
c.a.p.SO26775395.collector       1000  avgt       10     9.134 ±   0.310  us/op
c.a.p.SO26775395.collector    1000000  avgt       10  9091.649 ± 274.113  us/op
c.a.p.SO26775395.summary           10  avgt       10     0.110 ±   0.003  us/op
c.a.p.SO26775395.summary         1000  avgt       10     5.593 ±   0.234  us/op
c.a.p.SO26775395.summary      1000000  avgt       10  5598.776 ± 153.314  us/op

基准代码:

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
public class SO26775395 {

  @Param({"10", "1000", "1000000"}) int n;
  List<Weighter> weights;

  @Setup public void setup() {
    weights = new Random().doubles(n)
            .mapToObj(Weighter::new)
            .collect(toList());
  }

  @Benchmark public DoubleSummaryStatistics collector() {
    return weights.stream().collect(Collectors.summarizingDouble(Weighter::w));
  }

  @Benchmark public DoubleSummaryStatistics summary() {
    return weights.stream().mapToDouble(Weighter::w).summaryStatistics();
  }

  public static class Weighter {
    private final double w;
    public Weighter(double w) { this.w = w; }
    public double w() { return w; }
  }

}

关于java - 流收集与 map 收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775395/

相关文章:

Java 8 Stream of Super Classes, Parent Files, Component Parents, 链表等

java - 使用 @Scheduled 和 @EnableScheduling 但给出 NoSuchBeanDefinitionException

java - 与Java 8并行流相比,Spring Batch的任何性能改进均可以处理大量数据

java - 使用 Stream 从二维整数数组中查找奇数

java - 为什么在 Java 8 中按顺序收集并行流

java - 如何将具有多个过滤条件的 if-else if 链接 block 代码转换为具有空检查的单个过滤条件?

Java 8 流 : streaming files and delete after read

Java 到 php、字节、类型、数组

java - OutputStream 代码没有给出任何错误,但 txt 文件丢失

java - 在 Java (Servlet) 中将应用程序范围的设置放在哪里?