本文翻译自:Convert Iterable to Stream using Java 8 JDK
I have an interface which returns java.lang.Iterable<T>
. 我有一个返回java.lang.Iterable<T>
的接口。
I would like to manipulate that result using the Java 8 Stream API. 我想使用Java 8 Stream API处理该结果。
However Iterable can't "stream". 但是Iterable无法“流式传输”。
Any idea how to use the Iterable as a Stream without converting it to List? 任何想法如何将Iterable用作流而不转换为List?
#1楼
参考:https://stackoom.com/question/1cPoz/使用Java-JDK将Iterable转换为Stream
#2楼
You can easily create a Stream
out of an Iterable
or Iterator
: 您可以使用Iterable
或Iterator
轻松创建Stream
:
public static <T> Stream<T> stream(Iterable<T> iterable) {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
iterable.iterator(),
Spliterator.ORDERED
),
false
);
}
#3楼
There's a much better answer than using spliteratorUnknownSize
directly, which is both easier and gets a better result. spliteratorUnknownSize
直接使用spliteratorUnknownSize
相比,有一个更好的答案,这既简单又得到更好的结果。 Iterable
has a spliterator()
method, so you should just use that to get your spliterator. Iterable
具有spliterator()
方法,因此您应该使用该方法来获取您的spliterator。 In the worst case, it's the same code (the default implementation uses spliteratorUnknownSize
), but in the more common case, where your Iterable
is already a collection, you'll get a better spliterator, and therefore better stream performance (maybe even good parallelism). 在最坏的情况下,它是相同的代码(默认实现使用spliteratorUnknownSize
),但是在更常见的情况下,如果您的Iterable
已经是一个集合,您将获得更好的分离器,从而获得更好的流性能(甚至可能具有良好的并行性) )。 It's also less code: 它的代码也更少:
StreamSupport.stream(iterable.spliterator(), false)
.filter(...)
.moreStreamOps(...);
As you can see, getting a stream from an Iterable
(see also this question ) is not very painful. 如您所见,从Iterable
获得流(也请参见此问题 )不是很痛苦。
#4楼
我想建议使用JOOL库,它在Seq.seq(iterable)调用后隐藏了分隔符魔术,并且还提供了许多其他有用的功能。
#5楼
I've created this class: 我创建了此类:
public class Streams {
/**
* Converts Iterable to stream
*/
public static <T> Stream<T> streamOf(final Iterable<T> iterable) {
return toStream(iterable, false);
}
/**
* Converts Iterable to parallel stream
*/
public static <T> Stream<T> parallelStreamOf(final Iterable<T> iterable) {
return toStream(iterable, true);
}
private static <T> Stream<T> toStream(final Iterable<T> iterable, final boolean isParallel) {
return StreamSupport.stream(iterable.spliterator(), isParallel);
}
}
I think it's perfectly readable because you don't have to think about spliterators and booleans (isParallel). 我认为它是完全可读的,因为您不必考虑分隔符和布尔值(isParallel)。
#6楼
如果您可以使用Guava库(从21版开始),则可以使用
Streams.stream(iterable)