从 Eclipse 集合 IntList/IntIterable 创建一个 IntStream 和一个 Stream<Integer>
Create an IntStream and a Stream<Integer> from an Eclipse Collections IntList/IntIterable
我有一个 Eclipse Collections IntList
。我怎么能
- 从这个列表中创建一个 Java
IntStream
- 从这个列表中创建一个 Java
Stream<Integer>
不复制元素?
编辑: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 as a 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);
}
无论哪种方式,您都可以通过调用 IntStream.boxed()
获得 Stream<Integer>
。
有了 Eclipse Collections 10.0,您现在可以直接在 IntList
上调用 primitiveStream
。
IntStream intStream = IntLists.mutable.with(1, 2, 3, 4, 5).primitiveStream();
Stream<Integer> stream = intStream.boxed();
我有一个 Eclipse Collections IntList
。我怎么能
- 从这个列表中创建一个 Java
IntStream
- 从这个列表中创建一个 Java
Stream<Integer>
不复制元素?
编辑: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 as a 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);
}
无论哪种方式,您都可以通过调用 IntStream.boxed()
获得 Stream<Integer>
。
有了 Eclipse Collections 10.0,您现在可以直接在 IntList
上调用 primitiveStream
。
IntStream intStream = IntLists.mutable.with(1, 2, 3, 4, 5).primitiveStream();
Stream<Integer> stream = intStream.boxed();