为什么 Stream<T> 不实现 Iterable<T>?

2022-08-31 05:08:36

在Java 8中,我们有Class Stream<T>,奇怪的是它有一个方法。

Iterator<T> iterator()

因此,您会期望它实现接口 Iterable<T>,这恰恰需要此方法,但事实并非如此。

当我想使用 foreach 循环循环遍历 Stream 时,我必须执行类似操作

public static Iterable<T> getIterable(Stream<T> s) {
    return new Iterable<T> {
        @Override
        public Iterator<T> iterator() {
            return s.iterator();
        }
    };
}

for (T element : getIterable(s)) { ... }

我在这里错过了什么吗?


答案 1

人们已经在邮件列表上问过同样的问题☺。主要原因是Iterable也有可重复迭代的语义,而Stream则没有。

我认为主要原因是这意味着可重用性,而它只能使用一次 - 更像是.IterableStreamIterator

如果扩展,那么现有代码可能会感到惊讶,当它收到一个 抛出 a 第二次它们做 .StreamIterableIterableExceptionfor (element : iterable)


答案 2

要将 a 转换为 ,您可以执行StreamIterable

Stream<X> stream = null;
Iterable<X> iterable = stream::iterator

要将 传递给需要 的方法,StreamIterable

void foo(Iterable<X> iterable)

只是

foo(stream::iterator) 

然而,它可能看起来很有趣;最好是更明确一点

foo( (Iterable<X>)stream::iterator );

推荐