«Способ генерации (Поставщик ) в типе Stream не применимо для аргументов (int) "с List = Stream.generate () - PullRequest
2 голосов
/ 25 января 2020

Я пытаюсь сгенерировать случайный список целых чисел, как показано ниже:

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

Ошибка, отображаемая красным цветом при generate, гласит следующее:

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

Я думаю, это означает, что тип return для nextElement() не должен быть int, но я могу ошибаться. Как я могу исправить этот код, чтобы можно было генерировать случайный список целых чисел?

Ответы [ 2 ]

5 голосов
/ 25 января 2020

Метод Stream#generate(Supplier) принимает аргумент Supplier. Однако вы передаете результат вызова #nextElement() напрямую, то есть int. Простое исправление заключается в использовании:

Stream.generate(() -> nextElement())...

() -> nextElement() является лямбда-выражением и является реализацией Supplier<Integer>. Он также может быть записан в виде ссылки на метод : EnclosingClass::nextElement.


При этом существует более простой способ генерации потока случайных чисел с использованием Random#ints(long,int,int), который:

Возвращает поток, производящий заданное число streamSize числа псевдослучайных значений типа int, каждое из которых соответствует заданному источнику (включительно) и ограничено (исключено).

Вот пример, который сгенерирует 200 случайных чисел в диапазоне [0,100):

int[] array = new Random().ints(200, 0, 100).toArray();

Преимущество приведенного выше также заключается в использовании IntStream, который позволяет использовать int вместо Integer.

5 голосов
/ 25 января 2020

Когда вы звоните nextElement(), вы получаете int. Но generate хочет Supplier<T>. поставщик позвонит по номеру generate, он не предназначен для вас. Итак:

Stream.generate(YourClass::nextElement).limit(200).toArray(Integer[]::new);

или

Stream.generate(() -> nextElement()).limit(200).toArray(Integer[]::new);

Обратите внимание, что ваш код можно улучшить, избегая целых чисел в штучной упаковке, если вы используете IntStream:

int[] integers = IntStream.generate(YourClass::nextElement).limit(200).toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...