【发布时间】:2013-12-06 10:36:34
【问题描述】:
在 Java 8 中,我们有 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)) { ... }
我错过了什么吗?
【问题讨论】:
-
更不用说iterable的其他2个方法(forEach和spliterator)也在Stream中
-
这是将
Stream传递给期望Iterable的旧版API 所必需的 -
一个好的IDE(例如IntelliJ)会提示你将
getIterable()中的代码简化为return s::iterator; -
你根本不需要方法。如果你有一个 Stream,并且想要一个 Iterable,只需传递 stream::iterator(或者,如果你愿意,() -> stream.iterator()),你就完成了。
-
不幸的是我不能写
for (T element : stream::iterator),所以我仍然希望Stream也可以实现Iterable或方法toIterable()。
标签: java java-8 java-stream iterable