我想知道为什么Iterable
接口不提供stream()
and 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>
我认为是有道理的。)
The 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()
and parallelStream()
,我没有看到任何东西会使这成为不可能或不需要的?
我发现的一个相关问题如下:为什么 Stream 不实现 Iterable?
奇怪的是,这表明它以相反的方式做这件事。