我想知道为什么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();
}
}
它是一手牌的一种实现,因为您在玩交易纸牌游戏时可以手拿牌。
本质上,它包装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()
,我什么也看不到,因此不可能或不需要?
我发现的一个相关问题如下:为什么Stream <T>不实现Iterable <T>?
奇怪的是,这暗示它可以反过来做。
break;
进行迭代?(好的,Stream.findFirst()
可能是一个解决方案,但可能无法满足所有需求...)