首页 > 解决方案 > 如何将流收集到列表中?

问题描述

我正在关注一些教程,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

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

出了什么问题?

标签: javajava-stream

解决方案


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());

如果您希望继续使用ints,您可以int从过滤后的元素生成一个数组IntStream

var array = Arrays.stream(new int[] {1,2,3,4,5,6})
                  .filter(x -> x > 3)
                  .toArray();

推荐阅读