我想知道为什么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();
}
}
这是一个实现了“手牌”概念的类,可以在玩集换式卡片游戏时使用。它基本上包装了一个“Card”列表,并确保最大容量并提供一些其他有用的功能。与直接实现“List”相比,这种实现更好。为了方便起见,我认为实现“Iterable”会很不错,这样你就可以使用增强型for循环来遍历它。(我的“Hand”类还提供了一个“get(int index)”方法,因此在我看来,“Iterable”是合理的。)“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()
,我没有发现任何理由说明这是不可能或者不需要的?
我找到了一个相关的问题:为什么 Stream<T> 没有实现 Iterable<T>?
奇怪的是,这个问题建议以某种其他方式进行。
Stream.findFirst()
可能是一个解决方案,但可能不能满足所有需求...) - glglgl