Saya mencoba mengubah beberapa loop untuk setiap menjadi forEach()
-metode lambda untuk menemukan kemungkinan ekspresi lambda. Berikut ini tampaknya mungkin:
ArrayList<Player> playersOfTeam = new ArrayList<Player>();
for (Player player : players) {
if (player.getTeam().equals(teamName)) {
playersOfTeam.add(player);
}
}
Dengan lambda forEach()
players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}});
Tapi yang berikutnya tidak berhasil:
for (Player player : players) {
if (player.getName().contains(name)) {
return player;
}
}
dengan lambda
players.forEach(player->{if (player.getName().contains(name)) {return player;}});
Apakah ada yang salah dalam sintaks baris terakhir atau tidak mungkin untuk kembali dari forEach()
metode?
return
dalam pernyataan lambda kembali dari lambda itu sendiri, bukan dari apa pun yang disebut lambda. Mengakhiri aliran awal ("arus pendek") digunakanfindFirst
seperti yang ditunjukkan dalam jawaban Ian Roberts .Jawaban:
The
return
ada kembali dari ekspresi lambda bukan dari metode yang mengandung. Alih-alihforEach
Anda perlufilter
streaming:Di sini
filter
membatasi aliran ke item-item yang cocok dengan predikat, danfindFirst
kemudian mengembalikanOptional
dengan entri pertama yang cocok.Ini terlihat kurang efisien daripada pendekatan for-loop, tetapi pada kenyataannya
findFirst()
dapat menyebabkan hubungan pendek - tidak menghasilkan seluruh aliran yang difilter dan kemudian mengekstrak satu elemen darinya, melainkan hanya menyaring elemen sebanyak yang diperlukan untuk temukan yang pertama cocok. Anda juga bisa menggunakanfindAny()
bukanfindFirst()
jika Anda tidak perlu peduli tentang mendapatkan pertama pemain yang cocok dari (memerintahkan) aliran tetapi hanya setiap item yang cocok. Ini memungkinkan efisiensi yang lebih baik ketika ada paralelisme yang terlibat.sumber
orElse(null)
fileOptional
. Poin utama dariOptional
adalah menyediakan cara untuk menunjukkan ada atau tidaknya suatu nilai alih-alih membebani null (yang mengarah ke NPE). Jika Anda menggunakannyaoptional.orElse(null)
membeli kembali semua masalah dengan nulls. Saya akan menggunakannya hanya jika Anda tidak dapat mengubah pemanggil dan itu benar-benar mengharapkan null.Optional<Player>
menjadi cara yang lebih alami untuk menyesuaikan dengan paradigma aliran. Saya hanya mencoba menunjukkan bagaimana menduplikasi perilaku yang ada menggunakan lambda.Saya sarankan Anda untuk mencoba memahami Java 8 secara keseluruhan, yang paling penting dalam kasus Anda itu adalah aliran, lambda dan referensi metode.
Anda tidak boleh mengonversi kode yang ada ke kode Java 8 secara baris demi baris, Anda harus mengekstrak fitur dan mengonversinya.
Apa yang saya identifikasi dalam kasus pertama Anda adalah sebagai berikut:
Mari kita lihat bagaimana kita melakukannya, kita bisa melakukannya dengan yang berikut:
Apa yang Anda lakukan di sini adalah:
Collection<Player>
, sekarang Anda memiliki fileStream<Player>
.Predicate<Player>
, memetakan setiap pemain ke boolean true jika ingin disimpan.Collector
, di sini kita dapat menggunakan salah satu kolektor perpustakaan standar, yaituCollectors.toList()
.Ini juga menggabungkan dua poin lainnya:
List<E>
lebihArrayList<E>
.new ArrayList<>()
, Anda juga menggunakan Java 8.Sekarang ke poin kedua Anda:
Anda sekali lagi ingin mengubah sesuatu dari Java lama ke Java 8 tanpa melihat gambaran yang lebih besar. Bagian ini telah dijawab oleh @IanRoberts , meskipun menurut saya Anda perlu melakukan
players.stream().filter(...)...
apa yang dia sarankan.sumber
Jika Anda ingin mengembalikan nilai boolean, Anda dapat menggunakan sesuatu seperti ini (jauh lebih cepat daripada filter):
sumber
Inilah yang membantu saya:
Diambil dari Java 8 Menemukan Elemen Spesifik dalam Daftar dengan Lambda
sumber
Anda juga dapat membuat pengecualian:
catatan:
Demi keterbacaan, setiap langkah aliran harus dicantumkan di baris baru.
jika logika Anda secara longgar "didorong oleh pengecualian" seperti ada satu tempat di kode Anda yang menangkap semua pengecualian dan memutuskan apa yang harus dilakukan selanjutnya. Hanya gunakan pengembangan yang didorong pengecualian ketika Anda dapat menghindari mengotori basis kode Anda dengan kelipatan
try-catch
dan membuang pengecualian ini untuk kasus yang sangat khusus yang Anda harapkan dan dapat ditangani dengan benar.)sumber