如何在Iterable上执行Stream功能?

时间:2013-12-01 08:24:19

标签: java java-8 java-stream iterable spliterator

在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我失踪的操作?

3 个答案:

答案 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提供的好处(例如并行处理)。