java IntStream不能使用collect(Collectors.toList()),编译错误,为什么?
java IntStream cannot use collect(Collectors.toList()), compilation error, why?
如下:
IntStream iStream = IntStream.range(1,4);
iStream.forEach(System.out::print);
List list1 = iStream.collect(Collectors.toList());//error!
Java 1.8 编译器给出类型推导错误。类似的代码适用于字符串类型:
List<String> ls = new ArrayList<>();
ls.add("abc");
ls.add("xyz");
List list2 = ls.stream().collect(Collectors.toList());
为什么? IntStream/LongStream/DoubleStream 的工作方式与其他类型不同吗?如何修复我的编译错误?
原始流没有与 Stream
相同的 collect
方法。您可以将它们转换为包装器类型的流,以便使用接受 Collector
参数的 collect
方法:
List<Integer> list1 = iStream.boxed().collect(Collectors.toList());
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
中,因此您要使用哪个取决于您。就个人而言,我觉得第二个选项更简单明了。
如下:
IntStream iStream = IntStream.range(1,4);
iStream.forEach(System.out::print);
List list1 = iStream.collect(Collectors.toList());//error!
Java 1.8 编译器给出类型推导错误。类似的代码适用于字符串类型:
List<String> ls = new ArrayList<>();
ls.add("abc");
ls.add("xyz");
List list2 = ls.stream().collect(Collectors.toList());
为什么? IntStream/LongStream/DoubleStream 的工作方式与其他类型不同吗?如何修复我的编译错误?
原始流没有与 Stream
相同的 collect
方法。您可以将它们转换为包装器类型的流,以便使用接受 Collector
参数的 collect
方法:
List<Integer> list1 = iStream.boxed().collect(Collectors.toList());
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
中,因此您要使用哪个取决于您。就个人而言,我觉得第二个选项更简单明了。