gpt4 book ai didi

Java .forEach(list::add) 与 .collect(Collectors.toList())

转载 作者:行者123 更新时间:2023-12-02 01:50:34 26 4
gpt4 key购买 nike

什么更快?

List<E> bar = new ArrayList<>();
pan.stream() /* other functions */.forEach(bar::add);

List<E> bar = pan.stream() /* other functions */.collect(Collectors.toList());

最佳答案

我已经针对大小为 1 百万的列表测试了这两种场景。总的来说,顺序流几乎没有区别,但并行流有区别:

Benchmark                    Mode  Cnt  Score    Error   Units
Performance.collect avgt 200 0.022 ± 0.001 s/op
Performance.forEach avgt 200 0.021 ± 0.001 s/op
Performance.collectParallel avgt 200 0.124 ± 0.004 s/op
Performance.forEachParallel avgt 200 0.131 ± 0.001 s/op

在我看来,您不应该使用 forEach 来创建列表,因为它破坏了函数纯度规则,并且在使用并行流时,收集效率更高。

@Benchmark @BenchmarkMode(Mode.AverageTime)
public void collect(Blackhole blackhole) {
Stream<Double> stream = Stream.iterate(0.0, e -> Math.random());
List<Double> list = stream.limit(1000000).collect(Collectors.toList());
blackhole.consume(list);
}

@Benchmark @BenchmarkMode(Mode.AverageTime)
public void forEach(Blackhole blackhole) {
Stream<Double> stream1 = Stream.iterate(0.0, e -> Math.random());
List<Double> list = new ArrayList<>();
stream1.limit(1000000).forEach(e -> list.add(e));
blackhole.consume(list);
}

@Benchmark @BenchmarkMode(Mode.AverageTime)
public void collectParallel(Blackhole blackhole) {
Stream<Double> stream = Stream.iterate(0.0, e -> Math.random());
List<Double> list = stream.parallel().limit(1000000).collect(Collectors.toList());
blackhole.consume(list);
}

@Benchmark @BenchmarkMode(Mode.AverageTime)
public void forEachParallel(Blackhole blackhole) {
Stream<Double> stream1 = Stream.iterate(0.0, e -> Math.random());
List<Double> list = Collections.synchronizedList(new ArrayList<>());
stream1.parallel().limit(1000000).forEach(e -> list.add(e));
blackhole.consume(list);
}

关于Java .forEach(list::add) 与 .collect(Collectors.toList()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53035731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com