我有一个返回java.lang.Iterable<T>的接口。
我想使用Java 8流API来操作这个结果。
然而Iterable不能“流”。
任何想法如何使用Iterable作为流而不转换为列表?
我有一个返回java.lang.Iterable<T>的接口。
我想使用Java 8流API来操作这个结果。
然而Iterable不能“流”。
任何想法如何使用Iterable作为流而不转换为列表?
当前回答
如果你可以使用番石榴库,自版本21起,你就可以使用
Streams.stream(iterable)
其他回答
如果你碰巧使用Vavr(以前称为Javaslang),这可以很简单:
Iterable i = //...
Stream.ofAll(i);
我创建了这个类:
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);
}
}
我认为它是完全可读的,因为您不必考虑分裂器和布尔值(isParallel)。
解决这个问题的一个非常简单的方法是创建一个Streamable<T>接口,扩展Iterable<T>,其中包含一个默认的<T> stream()方法。
interface Streamable<T> extends Iterable<T> {
default Stream<T> stream() {
return StreamSupport.stream(spliterator(), false);
}
}
现在你的任何Iterable<T>都可以通过声明它们来实现streamable <T>而不是Iterable<T>。
如果你可以使用番石榴库,自版本21起,你就可以使用
Streams.stream(iterable)
我想建议使用JOOL库,它隐藏了Seq.seq(iterable)调用背后的分割器魔法,还提供了一大堆额外的有用功能。