Pourquoi ne Itérable<T> ne pas fournir de stream() et parallelStream() méthodes?

Je me demande pourquoi le Iterable interface ne permet pas de fournir les stream() et parallelStream() méthodes. Considérons la classe suivante:

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();
    }
}

C'est une mise en œuvre d'un Main que vous pouvez avoir des cartes dans votre main tout en jouant à un Jeu de Cartes à collectionner.

Essentiellement, il enroule une List<Card>, assure un maximum de capacité et offre d'autres fonctionnalités utiles. C'est mieux que de mettre en œuvre directement comme un List<Card>.

Maintenant, pour convienience j'ai pensé qu'il serait bien de mettre en œuvre Iterable<Card>, de sorte que vous pouvez utiliser renforcée pour boucles si vous souhaitez faire une boucle sur elle. (Mon Hand de la classe fournit également un get(int index) méthode, d'où le Iterable<Card> est justifié à mon avis.)

La Iterable interface fournit les suivantes (à gauche en sortant de 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);
    }
}

Maintenant, pouvez-vous obtenir un flux avec:

Stream<Hand> stream = StreamSupport.stream(hand.spliterator(), false);

Donc sur la vraie question:

  • Pourquoi ne Iterable<T> pas fournir une valeur par défaut des méthodes qui mettent en œuvre des stream() et parallelStream(), je ne vois rien qui pourrait la rendre impossible ou indésirable?

Une question connexe, j'ai trouvé est la suivante si: Pourquoi ne Stream<T> ne pas mettre en œuvre Itérable<T>?

Qui est curieusement il suggère de faire un peu l'inverse.

  • Je suppose que c'est une bonne question, pour le Lambda Liste de Diffusion.
  • Pourquoi est-il étrange de vouloir effectuer une itération sur un stream? Sinon, comment pourriez-vous éventuellement break; une itération? (Ok, Stream.findFirst() pourrait être une solution, mais ça pourrait ne pas répondre à tous les besoins...)
  • Voir aussi Convertir en objet iterable de Flux à l'aide de Java JDK 8 pour la pratique de solutions de contournement.
InformationsquelleAutor skiwi | 2014-04-16