Как преобразовать 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);