Во втором примере nextInt()
из класса Random
возвращает примитив int
, который нельзя собрать в List
.Добавьте вызов к boxed
, который преобразует int
в их класс-оболочку Integer
:
public static List<Integer> populateListStream2(int numberOfElements){
return IntStream.range(0,numberOfElements)
.map(e -> random.nextInt(numberOfElements/10))
.boxed()
.collect(Collectors.toList());
}
Но первый также вернул примитив int через приведение!
Да, но он был в Stream
, поэтому он был автоматически упакован в Integer
.Вы можете узнать, запустив:
Stream.generate(new Random()::nextDouble)
.limit(numberOfElements)
.map(e -> (int)(e*numberOfElements/10))
.peek(e -> System.out.println(e.getClass()))
.collect(Collectors.toList());
Какие отпечатки:
class java.lang.Integer
Последний был IntStream
.Одно из преимуществ IntStream
заключается в том, чтобы избегать автоматической упаковки и распаковки.Он не будет боксировать, если вы не вызовете явно boxed()
Также обратите внимание, что существуют методы из класса Random
, которые уже возвращают Stream
случайных чисел, таких как ints()
и doubles()