ray*_*man 402 java iterable java-8 java-stream
我有一个返回的界面java.lang.Iterable<T>
.
我想使用Java 8 Stream API来操纵该结果.
但是Iterable不能"流".
知道如何将Iterable用作Stream而不将其转换为List吗?
Bri*_*etz 545
有一个比spliteratorUnknownSize
直接使用更好的答案,这更容易,并获得更好的结果. Iterable
有一个spliterator()
方法,所以你应该用它来获得你的分裂器.在最坏的情况下,它是相同的代码(默认实现使用spliteratorUnknownSize
),但在更常见的情况下,你Iterable
已经是一个集合,你将获得一个更好的分裂器,因此更好的流性能(甚至可能是良好的并行性).它的代码也少了:
StreamSupport.stream(iterable.spliterator(), false)
.filter(...)
.moreStreamOps(...);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,从一个流中获取一个流Iterable
(也参见这个问题)并不是很痛苦.
num*_*ro6 62
如果您可以使用Guava库,那么从版本21开始,您就可以使用
Streams.stream(iterable)
Run Code Online (Sandbox Code Playgroud)
nos*_*sid 22
您可以轻松地创建Stream
出的Iterable
还是Iterator
:
public static <T> Stream<T> stream(Iterable<T> iterable) {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
iterable.iterator(),
Spliterator.ORDERED
),
false
);
}
Run Code Online (Sandbox Code Playgroud)
我创建了这个类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为它完全可读,因为您不必考虑拆分器和布尔值 (isParallel)。
So as another answer mentioned Guava has support for this by using:
Streams.stream(iterable);
Run Code Online (Sandbox Code Playgroud)
I want to highlight that the implementation does something slightly different than other answers suggested. If the Iterable
is of type Collection
they cast it.
public static <T> Stream<T> stream(Iterable<T> iterable) {
return (iterable instanceof Collection)
? ((Collection<T>) iterable).stream()
: StreamSupport.stream(iterable.spliterator(), false);
}
public static <T> Stream<T> stream(Iterator<T> iterator) {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(iterator, 0),
false
);
}
Run Code Online (Sandbox Code Playgroud)