Мне интересно, почему интерфейс 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-loops, если вы хотите перебрать его. (Мой класс 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> ?
Что, как ни странно, говорит о том, чтобы сделать это несколько наоборот.