如何将流收集到列表中?

时间:2020-02-04 12:34:46

标签: java java-stream

我正在关注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

但是每个教程都完全使用这样的收集代码。

出了什么问题?

3 个答案:

答案 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 您只给出了一个,这就是例外的原因。 希望对您有所帮助:)