“Stream 类型中的 generate(Supplier<? extends T>) 方法不适用于参数 (int)”,List = Stream.generate()

mpn*_*pnm 2 java list java-stream

我正在尝试生成一个随机的整数列表,如下所示:

private static int nextElement() {
    Random r = new Random();
    return r.nextInt(100);
}

public static void main(String[] args) {
    Integer[] integers = Stream.generate(nextElement())
                            .limit(200)
                            .toArray(Integer[]::new);
}
Run Code Online (Sandbox Code Playgroud)

该错误在 下显示为红色波浪线generate,说明如下:

The method generate(Supplier<? extends T>) in the type Stream is not 
 applicable for the arguments (int)
Run Code Online (Sandbox Code Playgroud)

我认为这意味着for的返回类型nextElement()不能是 an int,但我可能错了。如何修复此代码,以便可以生成随机整数列表?

ern*_*t_k 5

当你打电话时nextElement(),你会得到一个int. 但是generate想要一个Supplier<T>. 一个供应商将被调用generate,它并不意味着你调用。所以:

Stream.generate(YourClass::nextElement).limit(200).toArray(Integer[]::new);
Run Code Online (Sandbox Code Playgroud)

或者

Stream.generate(() -> nextElement()).limit(200).toArray(Integer[]::new);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用,可以通过避免使用装箱整数来改进您的代码IntStream

int[] integers = IntStream.generate(YourClass::nextElement).limit(200).toArray();
Run Code Online (Sandbox Code Playgroud)


Sla*_*law 5

Stream#generate(Supplier)方法接受一个Supplier参数。但是,您正在传递#nextElement()直接调用的结果,即int. 简单的解决方法是使用:

Stream.generate(() -> nextElement())...
Run Code Online (Sandbox Code Playgroud)

() -> nextElement()是一个lambda表达式,是一个实现Supplier<Integer>。它也可以被写成方法参考EnclosingClass::nextElement


话虽如此,有一种更简单的方法可以使用 生成随机数流Random#ints(long,int,int),它:

返回一个流,产生给定的 streamSize 数量的伪随机 int 值,每个值都符合给定的原点(包含)和边界(不包含)。

下面的示例将生成范围 [0,100) 中的 200 个随机数:

int[] array = new Random().ints(200, 0, 100).toArray();
Run Code Online (Sandbox Code Playgroud)

以上还具有使用 的好处,IntStream它可以让您使用int而不是Integer.