如何在java中将IntStream转换为List?

mil*_*bos -1 java list java-stream

我想将随机数流转换为列表:

public static void main(String[] args) {
        System.out.println(
                new Random().ints(10, 0, 20).
                        collect(Collectors.toList()));
    }
Run Code Online (Sandbox Code Playgroud)

但这给出了一个例外

java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
  required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
  found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
  reason: cannot infer type-variable(s) R
    (actual and formal argument lists differ in length)
Run Code Online (Sandbox Code Playgroud)

那么如何在java中将流转换为列表?

Zab*_*uza 5

解释

Random#ints返回IntStream,而不是 a Stream<Integer>,这是问题所在。

IntStream是一个特殊的类来表示原始ints。但是 Java 中的泛型不支持原语,即没有List<int>. 所以你首先必须让你intIntegers 成为包装类。然后你可以收集到List<Integer>.


解决方案

只需将其装箱即可

stream.boxed().toList() // since Java 16
// or
stream.boxed().collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

另请参阅以下文档IntStream#boxed

返回一个由该流的元素组成的流,每个元素都装箱为一个整数。

为了理解,boxed()大致相当于

stream.mapToObj(x -> Integer.valueOf(x))
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

public static void main(String[] args) {
    System.out.println(
        new Random()
            .ints(10, 0, 20)
            .boxed()
            .toList());
}
Run Code Online (Sandbox Code Playgroud)