(这可能与https://stackoverflow.com/a/30312177/160137有关,但我担心我还没有得到它。所以我以这种方式问我的问题,希望它能来#&# 39;我会得到一个我可以更容易理解的答案。)
通常当我有一个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
任何见解都将受到赞赏。
答案 0 :(得分:1)
对于基本类型List<>
是一个额外的次优用法。因此,toArray
被认为足够和充足(=最佳使用)。
int[] array = IntStream.of(3, 1, 4, 1, 5, 9).toArray();