Как преобразовать Java 8 IntStream в список?

Я смотрю на документы для IntStreamи я вижу toArray метод, но нет никакого способа пойти прямо к List<Integer>

Конечно, есть способ преобразовать Stream к List?

3 ответа

Решение

IntStream.boxed превращает IntStream в Stream<Integer>, который вы можете тогда collect в список:

theIntStream.boxed().collect(Collectors.toList())

Вы также можете использовать mapToObj() в потоке, который принимает IntFunction и возвращает объектно-ориентированный поток, состоящий из результатов применения данной функции к элементам этого потока.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());

Вы можете использовать примитивные коллекции, доступные в http://www.eclipse.org/collections/, и избегать бокса.

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);

Примечание: я участвую в коллекциях Eclipse.

Вы можете использовать метод сбора:

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);

Фактически, это почти именно то, что делает Java, когда вы вызываете.collect(Collectors.toList()) в потоке объектов:

public static <T> Collector<T, ?, List<T>> toList() {
    return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) -> {
        var0.addAll(var1);
        return var0;
    }, CH_ID);
}

Примечание. Третий параметр требуется только в том случае, если вы хотите запустить параллельный сбор; для последовательного сбора достаточно первых двух.

Найдите следующий пример нахождения квадрата каждого элемента int с использованием Java 8:

IntStream ints = Arrays.stream(new int[] {1,2,3,4,5});       
List<Integer> intsList = ints.map(x-> x*x)
          .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
Другие вопросы по тегам