Создайте IntStream и Stream <Integer>из коллекций Eclipse IntList / IntIterable - PullRequest
5 голосов
/ 03 апреля 2019

У меня есть Коллекции Затмений IntList. Как я могу

  1. Создать Java IntStream из этого списка
  2. Создать Java Stream<Integer> из этого списка

без копирования элементов?

Ответы [ 2 ]

5 голосов
/ 04 апреля 2019

Редактировать: Хольгер нашел гораздо более ясное решение:

public static IntStream intListToIntStream(IntList intList) {
    return IntStream.range(0, intList.size()).map(intList::get);
}

После изучения кода IntIterator оказалось, что реализация эквивалентна этому, поэтому приведенные ниже решения не нужны.Вы можете даже сделать это более эффективным, используя .parallel().


Если вы используете Java 9, вы можете использовать этот метод :

public static IntStream intListToIntStream(IntList intList) {
    IntIterator intIter = intList.intIterator();
    return IntStream.generate(() -> 0)
            .takeWhile(i -> intIter.hasNext())
            .map(i -> intIter.next());
}

В противном случае я не вижу лучшего решения, чем обернуть IntIterator в PrimitiveIterator.OfInt и создать из него поток:

public static IntStream intListToIntStream(IntList intList) {
    IntIterator intIter = intList.intIterator();
    return StreamSupport.intStream(Spliterators.spliterator(new PrimitiveIterator.OfInt() {
        @Override
        public boolean hasNext() {
            return intIter.hasNext();
        }
        @Override
        public int nextInt() {
            return intIter.next();
        }
    }, intList.size(), Spliterator.ORDERED), false);
}

В любом случаеВы можете просто получить Stream<Integer>, позвонив по номеру IntStream.boxed().

3 голосов
/ 14 июля 2019

С Eclipse Collections 10.0 теперь вы можете звонить primitiveStream прямо на IntList.

IntStream intStream = IntLists.mutable.with(1, 2, 3, 4, 5).primitiveStream();

Stream<Integer> stream = intStream.boxed();
...