gpt4 book ai didi

java - Stream.collect(Collectors.toList()) 与 Arrays.asList(stream.toArray())

转载 作者:行者123 更新时间:2023-12-02 01:32:08 28 4
gpt4 key购买 nike

假设:

  • 列表的可变性并不重要
  • 流是 Stream<Object>

    stream.collect(Collectors.toList()) 与 Arrays.asList(stream.toArray())

哪一个性能更好?

最佳答案

除非流知道大小(大多数流不知道),否则在收集所有对象之前,系统无法分配最终数组。

这意味着stream.toArray()必须首先收集可调整大小的容器中的所有对象,例如一个 ArrayList,然后从该集合创建数组。然后使用 Arrays.asList() 将该数组转换回列表。

因此,如果您想要一个列表,您应该要求一个列表,因为这样您就不会浪费时间转换为数组并再次转换回来。

此外,如果您想要一个列表,您应该要求一个列表,以帮助阐明您的代码。

示例:使用Arrays.asList(stream.toArray())分隔asListtoArray是流链很大:

List<Foo> fooList = Arrays.asList(stream   // <-- asList way up here
.filter(...)
.map(...)
.map(...)
.filter(...)
.toArray()); // <-- toArray way down here

使用 toList() 的相同代码在意图上必须更清晰:

List<Foo> fooList = stream
.filter(...)
.map(...)
.map(...)
.filter(...)
.collect(Collectors.toList()); // <-- toList in one place
<小时/>

谨防过早优化。编写代码是为了清晰和可维护性,除非分析显示您有问题。

当然,如果代码在性能至关重要的紧密循环中运行,您可以在分析之前进行优化。

但是,如果性能至关重要,那么您根本就不会使用流,因为使用流会产生开销。

关于java - Stream.collect(Collectors.toList()) 与 Arrays.asList(stream.toArray()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57549880/

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