我正在关注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
但是每个教程都完全使用这样的收集代码。
出了什么问题?
答案 0 :(得分:7)
Arrays.stream(new int[] {1,2,3,4,5,6})
创建一个IntStream
,它没有采用单个参数的collect
方法(collect
的{{1}}方法具有签名-{ {1}})。即使这样做,IntStream
也将不适用,因为Java不允许<R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R, R> combiner)
(即toList()
带有原始元素)。 List<int>
的元素必须是引用类型。
您可以改用包装器List
类型:
List
或者继续使用Integer
,然后将其装箱到var list = Arrays.stream(new Integer[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.collect(toList());
以便将元素收集到IntStream
中:
Stream<Integer>
如果您希望继续使用List<Integer>
,可以从过滤后的var list = Arrays.stream(new int[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.boxed()
.collect(toList());
的元素中生成int
数组:
int
答案 1 :(得分:3)
Arrays.stream(new int[] {1,2,3,4,5,6})
将返回IntStream
,而不是普通的Stream<Integer>
。
您可以使用Stream<Integer>
将其转换为.boxed()
:
var list = Arrays.stream(new int[] {1,2,3,4,5,6})
.filter(x -> x > 3)
.boxed()
.collect(toList());
答案 2 :(得分:-1)
看看这个: About collect (supplier, accumulator, combiner)
这将解决您的问题:
ArrayList<Object> collect = Arrays.stream(new int[] { 1, 2, 3, 4, 5, 6 }).filter(x -> x > 3)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
这里收集有三个参数Supplier,BiConsumer,BiConsumer 您只给出了一个,这就是例外的原因。 希望对您有所帮助:)