Я дивлюся на документи для IntStream, і бачу toArrayметод, але немає способу перейти безпосередньо доList<Integer>
Звичайно, є спосіб перетворити Streamна List?
Я дивлюся на документи для IntStream, і бачу toArrayметод, але немає способу перейти безпосередньо доList<Integer>
Звичайно, є спосіб перетворити Streamна List?
Відповіді:
IntStream::boxedIntStream::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);
}
Примітка: Третій параметр необхідний лише у тому випадку, якщо ви хочете запустити паралельний збір; для послідовного збору, що забезпечує лише перші два, буде достатньо.