Я дивлюся на документи для IntStream
, і бачу toArray
метод, але немає способу перейти безпосередньо доList<Integer>
Звичайно, є спосіб перетворити Stream
на List
?
Я дивлюся на документи для IntStream
, і бачу toArray
метод, але немає способу перейти безпосередньо доList<Integer>
Звичайно, є спосіб перетворити Stream
на List
?
Відповіді:
IntStream::boxed
IntStream::boxed
перетворюється IntStream
в a Stream<Integer>
, яке ви потім можете collect
перетворити в List
:
theIntStream.boxed().collect(Collectors.toList())
boxed
Метод перетворює int
примітивні значення IntStream
в потік Integer
об'єктів. Слово «бокс» називає int
⬌ Integer
процес перетворення. Дивіться навчальний посібник Oracle .
toList
. Це робиться шляхом розміщення таких серед імпорту файлу: static import java.util.stream.Collectors.toList;
. Тоді виклик збору читається просто .collect(toList())
.
Collectors
класу в налаштуваннях -> Java -> Редактор -> Допомога вмісту -> Вибране . Після цього вам потрібно лише набрати toLi
при натисканні клавіші Ctr + Space, щоб IDE заповнив toList
і додавав статичний імпорт.
boxed()
частину
Ви також можете використовувати mapToObj () для потоку, який приймає IntFunction і повертає об'єктно-ціннісний потік, що складається з результатів застосування заданої функції до елементів цього потоку.
List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
boxed()
делегування.
Ви можете використовувати примітивні колекції, доступні в колекціях Eclipse, і уникати боксу.
MutableIntList list =
IntStream.range(1, 5)
.collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);
Примітка. Я є учасником колекцій Eclipse.
MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Ви можете використовувати метод збирання:
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);
}
Примітка: Третій параметр необхідний лише у тому випадку, якщо ви хочете запустити паралельний збір; для послідовного збору, що забезпечує лише перші два, буде достатньо.