Як перетворити Java 8 IntStream у список?


283

Я дивлюся на документи для IntStream, і бачу toArrayметод, але немає способу перейти безпосередньо доList<Integer>

Звичайно, є спосіб перетворити Streamна List?


Спробуйте це посилання: stackoverflow.com/questions/14830313/…
Vaibhav Jain

2
@KarlRichter Інше питання не дає вам набраного списку. Крім того, це запитання було від чотирьох років тому, і воно має відповідь із 300+ заявами. Чому ми зараз намагаємось це об’єднати?
Ерік Вілсон

Відповіді:


541

IntStream::boxed

IntStream::boxedперетворюється IntStreamв a Stream<Integer>, яке ви потім можете collectперетворити в List:

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

boxedМетод перетворює intпримітивні значення IntStreamв потік Integerоб'єктів. Слово «бокс» називає intIntegerпроцес перетворення. Дивіться навчальний посібник Oracle .


1
@skiwi Я маю на увазі, що всі інші відповіді не потрібні після цього, як це було б не так природно.
Дмитро Гінзбург

1
Дякую, що я ще не бачив методу боксу, і він спрацював як принадність.
twreid

Доповнення: Я думаю, що цей код стає трохи коротшим, чіткішим і красивішим, якщо ви використовуєте статичний імпорт toList. Це робиться шляхом розміщення таких серед імпорту файлу: static import java.util.stream.Collectors.toList;. Тоді виклик збору читається просто .collect(toList()).
Лій

1
У Eclipse можна змусити IDE додати статичний імпорт для методів. Це робиться додаванням Collectorsкласу в налаштуваннях -> Java -> Редактор -> Допомога вмісту -> Вибране . Після цього вам потрібно лише набрати toLiпри натисканні клавіші Ctr + Space, щоб IDE заповнив toListі додавав статичний імпорт.
Лій

2
Виривав волосся про те, що було не в тому, що я спробував, дякую, що вказав на цю boxed()частину
К Рафаель,

16

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

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

4
В іронії іронії це boxed()делегування.
Макото

9

Ви можете використовувати примітивні колекції, доступні в колекціях Eclipse, і уникати боксу.

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

Примітка. Я є учасником колекцій Eclipse.


6
Хоча колекції Eclipse, як правило, дуже корисні, але це виглядає не так, що це зовсім полегшує :)
Ben

1
Починаючи з EC 9.0, ви можете створити примітивний список із примітивного потоку. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Дональд Рааб

1
Це те, що я шукав .. боксує інт-потік до Integer або заперечує проти іншого
Vikash

2

Знайдіть наступний приклад пошуку квадрата кожного елемента 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);

0

Ви можете використовувати метод збирання:

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);
}

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.