gpt4 book ai didi

intellij-idea - 如何将流收集到 CopyOnWriteArrayList 中

转载 作者:行者123 更新时间:2023-12-01 22:21:49 24 4
gpt4 key购买 nike

我收到“不兼容的类型,需要:CopyOnWriteArrayList,找到:对象”,内容如下。我正在使用 IntelliJ 2016.1.1。

CopyOnWriteArrayList<Foo> l = fields.stream()
.distinct()
.collect(toCollection(CopyOnWriteArrayList::new));

最佳答案

问题是 fields 有一个不合适的类型,很可能,它有一个原始类型,这会将 Stream 链的通用调用变成未经检查的操作返回它们的删除类型,对于终端 collect 调用是 Object

使用正确的类型,这没有问题,即

List<String> fields=Arrays.asList("foo", "bar", "baz", "foo");
CopyOnWriteArrayList<String> l =
fields.stream()
.distinct()
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));

有效。但请注意,用这种方式构建一个 CopyOnWriteArrayList 的成本相当高,正如“写入时复制”这个名称所暗示的那样。在每次插入时复制全部内容会导致二次时间复杂度。

解决方案是在转换为所需的目标类型之前收集到一个更适合增量构建的临时集合中。复制步骤可能看起来像开销,但与直接收集到 CopyOnWriteArrayList二次复杂性相比,它是线性开销。

CopyOnWriteArrayList<String> l =
fields.stream()
.distinct()
.collect(Collectors.collectingAndThen(
Collectors.toList(), CopyOnWriteArrayList::new));

请注意,在这种特定情况下,distinct 在幕后隐式构建了一个Set,因此我们可以通过构建Set 来提高性能显式代替临时 List 并删除 distinct 步骤:

CopyOnWriteArrayList<String> l =
fields.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(LinkedHashSet::new),
CopyOnWriteArrayList::new));

得出的结论是,对于这个特定的用例,我们可以让它变得更简单,甚至可能更高效:

CopyOnWriteArrayList<String> l = new CopyOnWriteArrayList<>(new LinkedHashSet<>(fields));

关于intellij-idea - 如何将流收集到 CopyOnWriteArrayList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39610750/

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