for (Canvas canvas : list) {
}
NetBeans menyarankan saya untuk menggunakan "operasi fungsional":
list.stream().forEach((canvas) -> {
});
Tetapi mengapa ini lebih disukai ? Jika ada, lebih sulit untuk dibaca dan dipahami. Anda menelepon stream()
, lalu forEach()
menggunakan ekspresi lambda dengan parameter canvas
. Saya tidak melihat bagaimana itu lebih bagus daripada for
loop di cuplikan pertama.
Jelas saya berbicara tentang estetika saja. Mungkin ada keuntungan teknis di sini yang saya lewatkan. Apa itu? Mengapa saya harus menggunakan metode kedua?
java
lambda
java8
stream-processing
Akhir
sumber
sumber
Jawaban:
Streaming menyediakan abstraksi yang jauh lebih baik untuk komposisi operasi berbeda yang ingin Anda lakukan di atas koleksi atau aliran data yang masuk. Terutama ketika Anda perlu memetakan elemen, memfilter dan mengubahnya.
Contoh Anda sangat tidak praktis. Pertimbangkan kode berikut dari situs Oracle .
dapat ditulis menggunakan stream:
Opsi kedua jauh lebih mudah dibaca. Jadi, ketika Anda memiliki loop bersarang atau berbagai loop melakukan pemrosesan parsial, itu kandidat yang sangat baik untuk penggunaan API Streams / Lambda.
sumber
stream.map(f).map(g)
≡stream.map(f.andThen(g))
) build / pengurangan fusi (ketika membangun aliran dalam satu metode dan kemudian meneruskannya ke metode lain yang mengkonsumsinya, kompiler dapat menghilangkan aliran) dan aliran fusi (yang dapat melebur banyak aliran ops bersama-sama menjadi satu loop imperatif), yang dapat membuat operasi aliran jauh lebih efisien. Mereka diimplementasikan dalam kompiler GHK Haskell, dan juga di beberapa Haskell lainnya dan kompiler bahasa fungsional lainnya, dan ada implementasi penelitian eksperimental untuk Scala.Keuntungan lain menggunakan API streaming fungsional adalah, bahwa ia menyembunyikan detail implementasi. Itu hanya menggambarkan apa yang harus dilakukan, bukan bagaimana. Keuntungan ini menjadi jelas ketika melihat perubahan yang perlu dilakukan, untuk mengubah dari satu threaded ke eksekusi kode paralel. Ubah saja
.stream()
ke.parallelStream()
.sumber
Itu sangat subyektif. Saya menemukan versi kedua lebih mudah dibaca dan dimengerti. Ini cocok dengan bagaimana bahasa lain (mis. Ruby, Smalltalk, Clojure, Io, Ioke, Seph) melakukannya, memerlukan lebih sedikit konsep untuk dipahami (itu hanya panggilan metode normal seperti yang lain, sedangkan contoh pertama adalah sintaksis khusus).
Jika ada, itu masalah keakraban.
sumber