Rumah  >  Artikel  >  Java  >  Analisis kod sumber ungkapan lambda peringkat pengasuh Java8

Analisis kod sumber ungkapan lambda peringkat pengasuh Java8

WBOY
WBOYke hadapan
2023-04-14 23:04:031102semak imbas

1. Gantikan kelas dalam tanpa nama

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!

2. Gunakan ungkapan lambda untuk mengulangi koleksi

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.

3. Gunakan ungkapan lambda untuk melaksanakan peta

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.

4. Gunakan ungkapan lambda untuk melaksanakan peta dan mengurangkan

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.

operasi 5.penapis

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?

6. Bekerjasama dengan Predikat antara muka berfungsi

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:
Jawa

Bahasa berakhir dengan:
Jawa
scala

Semua bahasa:
Java
Python
scala
Shell
R

Tiada 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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam