5

如下:

    IntStream iStream = IntStream.range(1,4);
    iStream.forEach(System.out::print);
    List list1 = iStream.collect(Collectors.toList());//error!

Java 1.8 编译器给出类型推断错误。类似的代码适用于 String 类型:

    List<String> ls = new ArrayList<>();
    ls.add("abc");
    ls.add("xyz");
    List list2 = ls.stream().collect(Collectors.toList());

为什么?IntStream/LongStream/DoubleStream 的工作方式与其他类型不同吗?如何修复我的编译错误?

4

2 回答 2

6

原始流没有collectStream. 您可以将它们转换为包装器类型的流,以便使用collect接受Collector参数的方法:

List<Integer> list1 = iStream.boxed().collect(Collectors.toList());
于 2018-11-16T07:46:47.977 回答
5

IntStream(连同其他原始流)没有collect(Collector)方法。它的收集方法是:collect(Supplier,ObjIntConsumer,BiConsumer).

如果您想将ints 收集到 aList中,您可以执行以下操作:

List<Integer> list = IntStream.range(0, 10).collect(ArrayList::new, List::add, List::addAll);

或者您可以调用boxed()将其转换IntStreamStream<Integer>

List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

这两个选项都会将原语 s 装箱intIntegers 中,因此您要使用哪个取决于您。就个人而言,我发现第二个选项更简单、更清晰。

于 2018-11-16T07:51:49.337 回答