java - 如何将流收集到列表中?
问题描述
我正在关注一些教程,Java Streams
看起来所有这些教程都已经过时了(或者显然我不明白)
var list = Arrays.stream(new int[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.collect(toList());
它告诉我这个错误:
Expected 3 arguments but found 1
但是每个教程都使用这样的收集代码。
出了什么问题?
解决方案
Arrays.stream(new int[] {1,2,3,4,5,6})
创建一个IntStream
,它没有collect
采用单个参数的方法(collect
方法IntStream
的签名 - <R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R, R> combiner)
)。即使有,toList()
也不适用,因为 Java 不允许List<int>
(即List
带有原始元素的 s)。a 的元素List
必须是引用类型。
您可以Integer
改为使用包装器类型:
var list = Arrays.stream(new Integer[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.collect(toList());
或者继续使用IntStream
, 并将其装箱到 aStream<Integer>
以便将元素收集到 a List<Integer>
:
var list = Arrays.stream(new int[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.boxed()
.collect(toList());
如果您希望继续使用int
s,您可以int
从过滤后的元素生成一个数组IntStream
:
var array = Arrays.stream(new int[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.toArray();