Katakan anda mempunyai sebakul makanan:
List<Food> basket = List.of( new Food("Apple", FRUIT), new Food("Banana", FRUIT), new Food("Carrot", VEGETABLE), new Food("Orange", FRUIT), );
Dan syarat untuk hanya menerima bakul ini jika ia hanya diisi dengan buah-buahan. Untuk memenuhi keperluan ini, anda memutuskan untuk melaksanakan gelung for:
private boolean containtsOnlyFruits(List<Food> basket) { for (Food food : basket) { if (food.getFoodType() != FRUIT) { return false; } } return true; }
Kemudian, anda ingat anda telah belajar tentang Java Lambdas dan pendekatan yang lebih berfungsi, jadi anda memutuskan untuk menulis perkara yang sama dalam forEach lambda:
private boolean containtsOnlyFruits(List<Food> basket) { basket.forEach(food -> { if (food.getFoodType() != FRUIT) { return false; } }); return true; }
Hanya untuk mencari ralat:
nilai pulangan yang tidak dijangka
Kenapa begitu?
Lambda tidak lebih daripada fungsi. Dalam kes ini, fungsi tanpa nama, atau dengan kata lain, fungsi tanpa nama. Sama seperti fungsi lain, lambda boleh menerima hujah dan juga mengharapkan sesuatu untuk dikembalikan.
Apabila anda cuba mengembalikan palsu daripada forEach lambda, anda sebenarnya cuba untuk keluar dari fungsi tanpa nama ini dan mengeluarkan boolean. Walau bagaimanapun, fungsi forEach tidak dijangka akan mengembalikan sebarang hasil. Ini bukan cara fungsi ini dilaksanakan.
Malah, jika anda melihat pelaksanaan fungsi forEach, anda akan melihat bahawa ia menerima Pengguna:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
Pengguna ialah antara muka yang mewakili operasi yang menerima argumen input tunggal dan tidak mengembalikan hasil. Dalam pelaksanaan ini, anda dapat melihat bahawa di bawah hud, fungsi forEach menggunakan a untuk setiap gelung, melaksanakan tindakan yang diberikan dan tidak mengembalikan apa-apa.
Jadi untuk memenuhi operasi kami dalam pendekatan berfungsi, kami perlu mencari lambda lain. Terdapat calon yang bagus di sini: allMatch.
Dengan lambda allMatch, kami boleh menyemak sama ada semua elemen bakul adalah buah:
private boolean onlyFruits(List<Food> basket) { return basket.stream().allMatch(food -> food.getFoodType() == FRUIT); }
Jika demikian keadaannya, lambda kami akan kembali benar. Dan jika kita lihat dalaman allMatch:
boolean allMatch(Predicate<? super T> predicate);
Kita akan melihat bahawa fungsi allMatch menjangkakan Predikat.
Predikat ialah antara muka berfungsi sama seperti Pengguna, tetapi ia berfungsi sedikit berbeza. Walaupun Pengguna mewakili operasi yang menerima argumen input tunggal dan tidak mengembalikan hasil, Predikat mewakili predikat (fungsi bernilai boolean) bagi satu argumen yang digunakan untuk menguji objek untuk syarat dan mengembalikan nilai boolean (benar atau salah. ).
Terdapat antara muka berfungsi yang sangat penting. Bolehkah anda beritahu saya apa itu dan cara ia berfungsi?
Kekal ingin tahu!
Menulis memerlukan masa dan usaha. Saya suka menulis dan berkongsi pengetahuan, tetapi saya juga mempunyai bil yang perlu dibayar.
Jika anda menyukai kerja saya, sila pertimbangkan untuk menderma melalui Beli Saya Kopi: https://www.buymeacoffee.com/RaphaelDeLio
Atau dengan menghantar saya BitCoin: 1HjG7pmghg3Z8RATH4aiUWr156BGafJ6Zw
Atas ialah kandungan terperinci Mengapa lambda forEach saya tidak membenarkan saya keluar dari fungsi saya dengan pernyataan pulangan dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!