如何将流收集到列表中?

Loa*_*ing 0 java java-stream

我正在学习一些教程,Java Streams看起来所有这些教程都已经过时了(或者显然我不明白)

 var list = Arrays.stream(new int[] {1,2,3,4,5,6})
            .filter(x -> x > 3)
            .collect(toList());
Run Code Online (Sandbox Code Playgroud)

它告诉我这个错误:

Expected 3 arguments but found 1
Run Code Online (Sandbox Code Playgroud)

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

出了什么问题?

Era*_*ran 7

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());
Run Code Online (Sandbox Code Playgroud)

或者继续使用 an IntStream,然后将其装箱Stream<Integer>以将元素收集到 a List<Integer>

var list = Arrays.stream(new int[] {1,2,3,4,5,6})
                 .filter(x -> x > 3)
                 .boxed()
                 .collect(toList());
Run Code Online (Sandbox Code Playgroud)

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

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