java IntStream无法使用collect(Collectors.toList()),编译错误,为什么?

时间:2018-11-16 07:44:54

标签: java compilation java-stream collect tolist

如下:

    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是否不能像其他类型一样工作?如何解决我的编译错误?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

IntStream(以及其他原始流)没有collect(Collector)方法。其收集方法为:collect(Supplier,ObjIntConsumer,BiConsumer)

如果要将int收集到List中,可以执行以下操作:

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

或者您可以调用boxed()IntStream转换为Stream<Integer>

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

这两个选项会将原始的int放入Integer中,因此您要使用的内容由您决定。就个人而言,我发现第二种选择更简单,更清晰。