32

在 Java 8 中,Stream该类没有任何方法来包装 an Iterable

相反,我Spliterator从 theIterable获取,然后StreamStreamSupport如下获取:

boolean parallel = true;

StreamSupport.stream(spliterator(), parallel)
                .filter(Row::isEmpty)
                .collect(Collectors.toList())
                .forEach(this::deleteRow);

是否有其他方法可以在我缺少Stream的一个上生成操作?Iterable

4

3 回答 3

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);
}
于 2014-04-04T18:21:42.870 回答
1

你描述的是从 Iterable 获取流的方法。这就是他们将 spliterator() 方法添加到 Iterable 的原因。我自己也做过同样的转换,还没有看到其他方法。

[更新]也许这个其他答案会澄清“为什么”。

于 2013-12-01T10:38:46.467 回答
1

我知道这并不能直接回答您的问题,但是相当数量的 Iterable 源(例如集合)现在也具有将对象作为流获取的方法。

我认为您在这个问题上会遇到的摩擦是 Iterable 在语义上是串行的,而 Spliterators 旨在用于并行处理。如果 JDK 中尚未提供您感兴趣的底层数据源,那么为您感兴趣的基础数据源实现 Spliterator 可能是一个更好的主意,因为仅使用 Iterable 周围的包装器不会让您获得 Stream API 提供的好处(例如并行处理)。

于 2014-03-27T00:02:41.867 回答