Joc*_*hen 6 java java-8 java-stream eclipse-collections
我有一个Eclipse Collections IntList。我怎么能够
IntStream从此列表创建JavaStream<Integer>从此列表创建Java没有复制元素?
编辑:Holger找到了一个更清晰的解决方案:
public static IntStream intListToIntStream(IntList intList) {
return IntStream.range(0, intList.size()).map(intList::get);
}
Run Code Online (Sandbox Code Playgroud)
在查看了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());
}
Run Code Online (Sandbox Code Playgroud)
否则,没有比将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);
}
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,您都可以Stream<Integer>通过致电来获取IntStream.boxed()。
使用Eclipse Collections 10.0,您现在可以primitiveStream直接调用IntList.
IntStream intStream = IntLists.mutable.with(1, 2, 3, 4, 5).primitiveStream();
Stream<Integer> stream = intStream.boxed();
Run Code Online (Sandbox Code Playgroud)