web-dev-qa-db-fra.com

Comment exécuter les fonctions Stream sur un Iterable?

Dans Java 8, la classe Stream n'a aucune méthode pour encapsuler un Iterable.

Au lieu de cela, j'obtiens le Spliterator du Iterable puis j'obtiens un Stream du StreamSupport comme ceci:

boolean parallel = true;

StreamSupport.stream(spliterator(), parallel)
                .filter(Row::isEmpty)
                .collect(Collectors.toList())
                .forEach(this::deleteRow);

Existe-t-il un autre moyen de générer des opérations Stream sur un Iterable qui me manque?

32
The Coordinator

Ma question similaire a été marquée comme doublon, mais voici les méthodes d'assistance que j'ai utilisées pour éviter une partie du passe-partout:

public static <T> Stream<T> stream(Iterable<T> in) {
    return StreamSupport.stream(in.spliterator(), false);
}

public static <T> Stream<T> parallelStream(Iterable<T> in) {
    return StreamSupport.stream(in.spliterator(), true);
}
36
Scott B

Je sais que cela ne répond pas directement à votre question, mais un nombre décent de sources itérables telles que les collections ont désormais une méthode pour obtenir l'objet en tant que flux.

Je pense que la friction que vous rencontrerez avec cette question est que Iterable est sémantiquement série alors que les séparateurs sont destinés à être utilisés pour le traitement en parallèle. Il est probablement préférable d'implémenter un séparateur pour la source de données sous-jacente qui vous intéresse si elle n'est pas déjà fournie dans le JDK, car le simple fait d'utiliser un wrapper autour de l'itérable ne vous permettra pas de bénéficier des avantages que l'API Stream fournit. (comme le traitement parallèle).

1
dsingleton

Ce que vous décrivez est la façon d'obtenir un flux depuis un Iterable. C'est pourquoi ils ont ajouté la méthode spliterator () à Iterable. J'ai fait la même conversion moi-même et je n'ai pas vu d'autre façon.

[MISE À JOUR] Peut-être que cette autre réponse apportera des éclaircissements sur le "pourquoi".

1
Jay