从Eclipse集合IntList / IntIterable创建一个IntStream和一个Stream <integer>

时间:2019-04-03 15:23:15

标签: java java-8 java-stream eclipse-collections

我有一个Eclipse Collections IntList。我怎么能

  1. 从此列表创建Java IntStream
  2. 从此列表创建Java Stream<Integer>

不复制元素?

2 个答案:

答案 0 :(得分:4)

编辑:Holger找到了更清晰的解决方案:

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

研究了IntIterator代码后,发现该实现等效于此实现,因此不需要以下解决方案。您甚至可以使用.parallel()来提高效率。


如果您使用的是Java 9,则可以使用this method

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()

答案 1 :(得分:3)

有了Eclipse Collections 10.0,您现在可以直接在primitiveStream上致电IntList

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

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