for (Canvas canvas : list) {
}
NetBeans schlägt mir vor, "funktionale Operationen" zu verwenden:
list.stream().forEach((canvas) -> {
});
Aber warum wird das bevorzugt ? Wenn überhaupt, ist es schwieriger zu lesen und zu verstehen. Sie rufen auf stream()
und verwenden dann forEach()
einen Lambda-Ausdruck mit Parameter canvas
. Ich sehe nicht, wie das schöner ist als die for
Schleife im ersten Snippet.
Offensichtlich spreche ich nur aus ästhetischen Gründen. Vielleicht gibt es hier einen technischen Vorteil, den ich vermisse. Was ist es? Warum sollte ich stattdessen die zweite Methode verwenden?
java
lambda
java8
stream-processing
Omega
quelle
quelle
Antworten:
Streams bieten eine viel bessere Abstraktion für die Komposition verschiedener Operationen, die Sie zusätzlich zu den eingehenden Sammlungen oder Streams von Daten ausführen möchten. Insbesondere, wenn Sie Elemente zuordnen, filtern und konvertieren müssen.
Ihr Beispiel ist nicht sehr praktisch. Betrachten Sie den folgenden Code von der Oracle-Site .
kann mit Streams geschrieben werden:
Die zweite Option ist viel besser lesbar. Wenn Sie also verschachtelte Schleifen oder verschiedene Schleifen haben, die eine teilweise Verarbeitung durchführen, ist dies ein sehr guter Kandidat für die Verwendung der Streams / Lambda-API.
quelle
stream.map(f).map(g)
≡stream.map(f.andThen(g))
), Build / Reduction Fusion (wenn ein Stream in einer Methode erstellt und dann an eine andere Methode übergeben wird, die ihn verbraucht, kann der Compiler den Stream eliminieren) und Stream Fusion (die viele Stream Ops verschmelzen kann) zusammen in einer einzigen imperativen Schleife), wodurch Stream-Vorgänge viel effizienter werden können. Sie sind im GHC-Haskell-Compiler sowie in einigen anderen Haskell- und anderen Compilern für funktionale Sprachen implementiert, und es gibt experimentelle Forschungsimplementierungen für Scala.Ein weiterer Vorteil der Verwendung der funktionalen Streaming-API besteht darin, dass Implementierungsdetails ausgeblendet werden. Es wird nur beschrieben, was und nicht wie zu tun ist. Dieser Vorteil wird deutlich, wenn man sich die Änderung ansieht, die vorgenommen werden muss, um von der Ausführung mit einem Thread zur Ausführung mit parallelem Code zu wechseln. Ändern Sie einfach die
.stream()
zu.parallelStream()
.quelle
Das ist sehr subjektiv. Ich finde die zweite Version viel einfacher zu lesen und zu verstehen. Es passt dazu, wie andere Sprachen (z. B. Ruby, Smalltalk, Clojure, Io, Ioke, Seph) es tun, es erfordert weniger Konzepte zum Verstehen (es ist nur ein normaler Methodenaufruf wie jeder andere, während das erste Beispiel eine spezialisierte Syntax ist).
Wenn überhaupt, ist es eine Frage der Vertrautheit.
quelle