Rumah >Java >javaTutorial >Analisis kod sumber ungkapan lambda peringkat pengasuh Java8
Tidak syak lagi bahawa peristiwa yang paling biasa digunakan untuk ungkapan lambda adalah untuk menggantikan kelas dalam tanpa nama, dan melaksanakan antara muka Runnable ialah contoh klasik kelas dalam tanpa nama. Ungkapan Lambda agak berkuasa Anda boleh menggunakan ()-> Sila lihat kod:
Jika anda menggunakan kelas dalaman tanpa nama:
@Test public void oldRunable() { new Thread(new Runnable() { @Override public void run() { System.out.println("The old runable now is using!"); } }).start(); }
Dan jika anda menggunakan ungkapan lambda:
@Test public void runable() { new Thread(() -> System.out.println("It's a lambda function!")).start(); }
Output akhir:
Runable lama kini sedang digunakan!
Ia adalah fungsi lambda!
Bukankah ia sangat berkuasa? Adakah ia sangat mudah? Adakah ia sangat jelas dan terfokus? Ini adalah perkara yang menakutkan tentang ungkapan lambda Ia menggunakan kod yang sangat sedikit untuk mencapai apa yang dilakukan oleh kelas sebelumnya!
Kelas koleksi Java sering digunakan dalam pembangunan harian, malah dikatakan tiada kod Java yang tidak menggunakan kelas koleksi. . . Operasi yang paling biasa pada kelas pengumpulan ialah lintasan berulang. Sila lihat perbandingan:
@Test public void iterTest() { List<String> languages = Arrays.asList("java","scala","python"); //before java8 for(String each:languages) { System.out.println(each); } //after java8 languages.forEach(x -> System.out.println(x)); languages.forEach(System.out::println); }
Jika anda biasa dengan scala, anda mesti biasa dengan forEach. Ia mengulangi semua objek dalam koleksi dan membawa ekspresi lambda ke dalamnya.
languages.forEach(System.out::println);
Baris ini kelihatan sedikit seperti cara resolusi skop ditulis dalam C++, dan ia juga boleh dilakukan di sini.
Apabila ia berkaitan dengan pengaturcaraan berfungsi dan ungkapan lambda, bagaimana kita tidak boleh menyebut peta. . . Ya, java8 pasti disokong. Sila lihat kod sampel:
@Test public void mapTest() { List<Double> cost = Arrays.asList(10.0, 20.0,30.0); cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x)); }
Hasil keluaran akhir:
10.5
21.0
31.5
Fungsi peta boleh dikatakan sebagai kaedah terpenting dalam pengaturcaraan berfungsi. Fungsi peta ialah mengubah satu objek kepada objek lain. Dalam contoh kami, kos dinaikkan sebanyak 0.05 kali saiz melalui kaedah peta dan kemudian keluaran.
Memandangkan peta disebut, bagaimana kita tidak menyebut pengurangan. Seperti peta, reduce juga merupakan salah satu kaedah terpenting dalam pengaturcaraan berfungsi. . . Fungsi peta adalah untuk menukar satu objek kepada yang lain, manakala fungsi mengurangkan adalah untuk menggabungkan semua nilai menjadi satu. Sila lihat:
@Test public void mapReduceTest() { List<Double> cost = Arrays.asList(10.0, 20.0,30.0); double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get(); System.out.println(allCost); }
Hasil akhir ialah:
.63.0
Jika kita menggunakan gelung for untuk melakukan ini:
@Test public void sumTest() { List<Double> cost = Arrays.asList(10.0, 20.0,30.0); double sum = 0; for(double each:cost) { each += each * 0.05; sum += each; } System.out.println(sum); }
Saya percaya bahawa menggunakan ungkapan map+reduce+lambda adalah lebih daripada satu tahap lebih tinggi.
penapis juga merupakan operasi yang sering kami gunakan. Apabila mengendalikan koleksi, selalunya perlu menapis beberapa elemen daripada koleksi asal.
@Test public void filterTest() { List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0); List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList()); filteredCost.forEach(x -> System.out.println(x)); }
Keputusan akhir:
30.0
40.0
Tulis java daripada python atau Do anda mempunyai perasaan scala? Bukankah dia sangat kacak?
Selain menyokong gaya pengaturcaraan berfungsi pada peringkat bahasa, Java 8 juga menambah pakej yang dipanggil java.util.function. Ia mengandungi banyak kelas untuk menyokong pengaturcaraan berfungsi dalam Java. Salah satu daripadanya ialah Predikat. Menggunakan antara muka fungsi java.util.function.Predicate dan ungkapan lambda, anda boleh menambah logik pada kaedah API dan menyokong gelagat yang lebih dinamik dengan kurang kod. Antara muka Predikat sangat sesuai untuk penapisan.
public static void filterTest(List<String> languages, Predicate<String> condition) { languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " ")); } public static void main(String[] args) { List<String> languages = Arrays.asList("Java","Python","scala","Shell","R"); System.out.println("Language starts with J: "); filterTest(languages,x -> x.startsWith("J")); System.out.println("\nLanguage ends with a: "); filterTest(languages,x -> x.endsWith("a")); System.out.println("\nAll languages: "); filterTest(languages,x -> true); System.out.println("\nNo languages: "); filterTest(languages,x -> false); System.out.println("\nLanguage length bigger three: "); filterTest(languages,x -> x.length() > 4); }
Output akhir:
Bahasa bermula dengan J:
JawaBahasa berakhir dengan:
Jawa
scalaSemua bahasa:
Java
Python
scala
Shell
RTiada bahasa:
Panjang bahasa lebih besar tiga:
Python
scala
Shell
Seperti yang anda lihat, kaedah penapis API Strim juga menerima Predikat, yang bermaksud kaedah penapis() tersuai kami boleh digantikan dengan menulis Di dalam kod sebaris, ini juga keajaiban ungkapan lambda.
Atas ialah kandungan terperinci Analisis kod sumber ungkapan lambda peringkat pengasuh Java8. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!