gpt4 book ai didi

java - 为什么 Collectors.toList() 不适用于原始集合?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:08 26 4
gpt4 key购买 nike

(这可能与 https://stackoverflow.com/a/30312177/160137 有关,但恐怕我还是不明白。所以我以这种方式问我的问题,希望它能得到答案我可以更多很容易理解。)

通常当我有一个 Stream 时,我可以使用 Collectors 类中的静态方法之一将它转换为一个集合:

List<String> strings = Stream.of("this", "is", "a", "list", "of", "strings")
.collect(Collectors.toList());

但是,正如其他人所注意到的那样,类似的过程不适用于原始流:

IntStream.of(3, 1, 4, 1, 5, 9)
.collect(Collectors.toList()); // doesn't compile

我可以这样做:

IntStream.of(3, 1, 4, 1, 5, 9)
.boxed()
.collect(Collectors.toList());

或者我可以这样做:

IntStream.of(3, 1, 4, 1, 5, 9)
.collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

问题是,为什么 Collectors.toList() 不只对原始流执行此操作?是不是没有办法指定包装类型?如果是这样,为什么这也不起作用:

IntStream.of(3, 1, 4, 1, 5, 9)
.collect(Collectors.toCollection(ArrayList<Integer>::new)); // nope

如有任何见解,我们将不胜感激。

最佳答案

嗯,让IntStream没问题提供带有签名的方法
<R,A> R collect(Collector<? super Integer,A,R> collector)执行隐式装箱。它可以像 return boxed().collect(collector); 一样简单地实现.

问题是“为什么要这样”或反过来:为什么原始流特化存在?

它们的存在只是出于性能原因,以提供流操作而无需装箱开销。因此,不包含任何已存在于通用 Stream 中的操作是一个明显的设计决定。对于所有这些接口(interface),您可以简单地调用 boxed().genericOperation(…) .

answer, you have linked解决了一个相关但不同的想法。这是关于提供 collect方法不接受通用 Collector ,而是像 Collector.ofInt 这样的原始特化可以收集int没有装箱的值,但对于产生 List<Integer> 的收集器, 不可避免地包含盒装值,它不会有任何好处。在预建收集器中,只有少数人真正可以避免装箱。所有这些都作为原始流上的显式终端操作提供(count()sum()min()max()summaryStatistics()、……)

这是类/接口(interface)数量和潜在性能增益之间的权衡。对于一般的流,决定是创建 IntStream , LongStreamDoubleStream ,但对于 Collection 家而言,决定不添加此类特化。

关于java - 为什么 Collectors.toList() 不适用于原始集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964268/

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