8

我有一个Eclipse Collections IntList。我怎样才能

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

不复制元素?

4

2 回答 2

5

使用Eclipse Collections 10.0,您现在可以primitiveStream直接调用IntList.

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

Stream<Integer> stream = intStream.boxed();
于 2019-07-13T22:18:12.053 回答
5

编辑:霍尔格的评论找到了一个更清晰的解决方案:

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

于 2019-04-03T22:20:43.290 回答