【问题标题】:java IntStream cannot use collect(Collectors.toList()), compilation error, why? [duplicate]java IntStream不能使用collect(Collectors.toList()),编译出错,为什么? [复制]
【发布时间】:2019-04-19 09:11:04
【问题描述】:

如下:

    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 的工作方式与其他类型不同吗?如何修复我的编译错误?

【问题讨论】:

  • 收集前请致电boxed ()

标签: java compilation java-stream collect tolist


【解决方案1】:

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

List<Integer> list1 = iStream.boxed().collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    IntStream(以及其他原始流)没有collect(Collector) 方法。它的collect方法是:collect(Supplier,ObjIntConsumer,BiConsumer)

    如果您想将ints 收集到List 中,您可以这样做:

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

    或者您可以调用boxed()IntStream 转换为Stream&lt;Integer&gt;

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

    这两个选项都会将原语ints 装箱到Integers,所以你想使用哪个取决于你。就个人而言,我发现第二个选项更简单明了。

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多