在Java 8中,Stream
类没有任何方法来包装Iterable
。
相反,我从Spliterator
获取Iterable
,然后从Stream
获取StreamSupport
,如下所示:
boolean parallel = true;
StreamSupport.stream(spliterator(), parallel)
.filter(Row::isEmpty)
.collect(Collectors.toList())
.forEach(this::deleteRow);
是否有其他方法可以在Stream
上生成Iterable
我失踪的操作?
答案 0 :(得分:36)
我的类似问题被标记为重复,但这里是我用来避免某些样板的辅助方法:
public static <T> Stream<T> stream(Iterable<T> in) {
return StreamSupport.stream(in.spliterator(), false);
}
public static <T> Stream<T> parallelStream(Iterable<T> in) {
return StreamSupport.stream(in.spliterator(), true);
}
答案 1 :(得分:1)
您所描述的 是从Iterable获取流的方式。这就是他们将spliterator()方法添加到Iterable的原因。我自己做了同样的转换,没有看到另一种方式。
[更新]也许这个other answer会对“为什么”做出一些澄清。
答案 2 :(得分:1)
我知道这并没有直接回答你的问题,但是大量的Iterable资源(例如集合)现在都有一种将对象作为流来获取的方法。
我认为你将遇到这个问题的摩擦是Iterable在语义上是串行的,而Spliterators是用于并行处理的。如果JDK中尚未提供Spliterator,那么为您感兴趣的基础数据源实现Spliterator可能更好一点,因为仅使用Iterable周围的包装器将无法获得Stream API提供的好处(例如并行处理)。