作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到“不兼容的类型,需要: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/
我是一名优秀的程序员,十分优秀!