for (Canvas canvas : list) {
}
NetBeans me suggère d’utiliser des "opérations fonctionnelles":
list.stream().forEach((canvas) -> {
});
Mais pourquoi est-ce préféré ? Au contraire, il est plus difficile à lire et à comprendre. Vous appelez stream()
puis forEach()
utilisez une expression lambda avec paramètre canvas
. Je ne vois pas en quoi cela est plus agréable que la for
boucle du premier extrait.
Évidemment, je parle uniquement d'esthétique. Peut-être me manque-t-il un avantage technique. Qu'Est-ce que c'est? Pourquoi devrais-je utiliser la deuxième méthode à la place?
Réponses:
Les flux fournissent une bien meilleure abstraction pour la composition des différentes opérations que vous souhaitez effectuer en plus des collections ou des flux de données entrants. Surtout lorsque vous devez mapper, filtrer et convertir des éléments.
Votre exemple n'est pas très pratique. Considérez le code suivant du site Oracle .
peut être écrit en utilisant des flux:
La deuxième option est beaucoup plus lisible. Ainsi, lorsque vous avez des boucles imbriquées ou diverses boucles effectuant un traitement partiel, c'est un très bon candidat pour l'utilisation de l'API Streams / Lambda.
la source
stream.map(f).map(g)
≡stream.map(f.andThen(g))
) build / réduire la fusion (lors de la construction d' un ruisseau dans une méthode et passer ensuite à une autre méthode qui consomme, le compilateur peut éliminer le flux) et fusion courant ( ce qui peut fusionner plusieurs opérations de flux ensemble en une seule boucle impérative), ce qui peut rendre les opérations de flux beaucoup plus efficaces. Ils sont implémentés dans le compilateur GHC Haskell, ainsi que dans d'autres compilateurs Haskell et d'autres langages fonctionnels, et il existe des implémentations de recherche expérimentale pour Scala.L’utilisation de l’API de streaming fonctionnelle présente également l’avantage de cacher des détails d’implémentation. Il décrit uniquement ce qui doit être fait, pas comment. Cet avantage devient évident lorsque l’on examine le changement à effectuer, qui consiste à passer de l’exécution de code unique à l’exécution de code parallèle. Il suffit de changer le
.stream()
à.parallelStream()
.la source
C'est très subjectif. Je trouve la deuxième version beaucoup plus facile à lire et à comprendre. Cela correspond à la façon dont les autres langages (ex. Ruby, Smalltalk, Clojure, Io, Ioke, Seph) le fait, il nécessite moins de concepts à comprendre (c'est juste un appel de méthode normal comme un autre, alors que le premier exemple est une syntaxe spécialisée).
Si quelque chose, c'est une question de familiarité.
la source