Как заполнить список <Integer>от IntStream? - PullRequest
2 голосов
/ 10 апреля 2019

Я хочу заполнить список numberOfElements элементами случайных целых чисел в диапазоне от 0 до numberOfElements/10.Почему метод populateListStream1() работает, а populateListStream2() не работает?

public static List<Integer> populateListStream1(int numberOfElements) {
    return Stream.generate(new Random()::nextDouble)
            .limit(numberOfElements)
            .map(e -> (int)(e*numberOfElements/10))
            .collect(Collectors.toList());
}

public static List<Integer> populateListStream2(int numberOfElements) {
    return IntStream.range(0,numberOfElements)
            .map(e -> random.nextInt(numberOfElements/10))
            .collect(Collectors.toList());
}

Ответы [ 3 ]

7 голосов
/ 10 апреля 2019

Во втором примере 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()

0 голосов
/ 10 апреля 2019

Второй не работает, потому что вы используете IntStream, который содержит примитивные типы int.Вы должны позвонить boxed() до map().Но лучшим решением было бы использовать mapToObj() вместо map():

public static List<Integer> populateListStream2(int numberOfElements) {
    return IntStream.range(0, numberOfElements)
            .mapToObj(e -> random.nextInt(numberOfElements / 10))
            .collect(Collectors.toList());
}

В этом случае значения автоматически упаковываются, как в вашем методе populateListStream2().

В качестве альтернативы я бы порекомендовал использовать Random.ints() для генерации потока целых чисел.

0 голосов
/ 10 апреля 2019

Коробка int это обёртка соответствующего класса Integer.Также вы можете попробовать что-то вроде:

  public static List<Integer> populateListStream3(int numberOfElements) {
        List<Integer> listOfIntegers = new Random().ints(numberOfElements, 0, numberOfElements/10).boxed().collect(Collectors.toList());
        return listOfIntegers;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...