为什么Collectors.toList()不能处理原始集合?

时间:2016-08-15 23:01:35

标签: java java-8 collectors

(这可能与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

任何见解都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

对于基本类型List<>是一个额外的次优用法。因此,toArray被认为足够和充足(=最佳使用)。

int[] array = IntStream.of(3, 1, 4, 1, 5, 9).toArray();