【发布时间】:2014-05-31 14:18:04
【问题描述】:
我想知道为什么Iterable 接口不提供stream() 和parallelStream() 方法。考虑以下类:
public class Hand implements Iterable<Card> {
private final List<Card> list = new ArrayList<>();
private final int capacity;
//...
@Override
public Iterator<Card> iterator() {
return list.iterator();
}
}
它是Hand的一种实现,因为您可以在玩集换式卡牌游戏时手中有牌。
基本上它包装了List<Card>,确保了最大容量并提供了一些其他有用的功能。最好直接将其实现为List<Card>。
现在,为了方便起见,我认为实现 Iterable<Card> 会很好,这样如果你想循环它,你可以使用增强的 for 循环。 (我的Hand 类也提供了get(int index) 方法,因此我认为Iterable<Card> 是合理的。)
Iterable 接口提供以下内容(省略 javadoc):
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
现在你可以获得一个流:
Stream<Hand> stream = StreamSupport.stream(hand.spliterator(), false);
所以到真正的问题:
- 为什么
Iterable<T>不提供实现stream()和parallelStream()的默认方法,我看不出这不可能或不需要?
我发现的一个相关问题如下:Why does Stream<T> not implement Iterable<T>?
奇怪的是,它暗示它以相反的方式去做。
【问题讨论】:
-
我想这对Lambda Mailing List来说是个好问题。
-
为什么要遍历流很奇怪?你怎么可能
break;一个迭代? (好吧,Stream.findFirst()可能是一个解决方案,但可能无法满足所有需求......) -
另请参阅Convert Iterable to Stream using Java 8 JDK 了解实际解决方法。
标签: java java-8 java-stream iterable