国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah Java JavaAsas 介紹Java8語(yǔ)法糖之Lambda表達(dá)式

介紹Java8語(yǔ)法糖之Lambda表達(dá)式

Feb 18, 2021 pm 06:09 PM
java8 lambda

介紹Java8語(yǔ)法糖之Lambda表達(dá)式

免費(fèi)學(xué)習(xí)推薦:java基礎(chǔ)教程

一、Lambda表達(dá)式簡(jiǎn)介

Lambda表達(dá)式,是Java8的一個(gè)新特性,也是Java8中最值得學(xué)習(xí)的新特性之一。(另一個(gè)新特性是流式編程。)

  • Lambda表達(dá)式,從本質(zhì)上講是一個(gè)匿名方法??梢允褂眠@個(gè)匿名方法,實(shí)現(xiàn)接口中的方法

  • 功能:通常使用Lambda表達(dá)式,是為了簡(jiǎn)化接口實(shí)現(xiàn)的。關(guān)于接口實(shí)現(xiàn)可以有多種方式實(shí)現(xiàn),例如:①設(shè)計(jì)接口的實(shí)現(xiàn)類、②使用匿名內(nèi)部類。但是③使用lambda表達(dá)式,比這兩種方式都簡(jiǎn)單。

  • 要求:lambda表達(dá)式,只能實(shí)現(xiàn)函數(shù)式接口:即一個(gè)接口中,要求實(shí)現(xiàn)類必須實(shí)現(xiàn)的抽象方法,有且只有一個(gè)。

@FunctionalInterface注解 ,用在接口之前,用來(lái)判斷接口是否是一個(gè)函數(shù)式接口。如果不是函數(shù)式接口會(huì)報(bào)錯(cuò)。功能類似于@Override。

二、Lambda表達(dá)式語(yǔ)法

lambda表達(dá)式本質(zhì)上是一個(gè)匿名方法,因此再寫(xiě)lambda表達(dá)式時(shí),不需要關(guān)心方法名是什么,也不需要關(guān)心返回值類型。只需要關(guān)心兩部分:參數(shù)列表、方法體

  • ()參數(shù)部分:方法的參數(shù)列表,要求和實(shí)現(xiàn)的接口中的方法參數(shù)部分一致,包括參數(shù)的數(shù)量和類型。
  • {}方法體部分:方法的實(shí)現(xiàn)部分,如果接口中定義的方法有返回值,則在實(shí)現(xiàn)時(shí),注意返回值的返回。
  • -> :分隔參數(shù)部分和方法體部分。
Lambda表達(dá)式基礎(chǔ)語(yǔ)法:(參數(shù))?->{
	方法體}

下面定義6種參數(shù)和返回值各不相同的函數(shù)式接口,分別使用lambda表達(dá)式對(duì)接口中的方法進(jìn)行實(shí)現(xiàn):

在這里插入圖片描述

下面是針對(duì)上面6種函數(shù)式接口的lambda表達(dá)式實(shí)現(xiàn)。

/**
?*?@Description:
?*?@author?Guoqianliang
?*?@date?19:50?-?2021/2/15
?*/public?class?BasicSyntax?{
????public?static?void?main(String[]?args)?{
????????//?1.實(shí)現(xiàn)無(wú)參數(shù),無(wú)返回值的函數(shù)式接口
????????NoneReturnNoneParameter?lambda1?=?()?->?{
????????????System.out.println("這是無(wú)參,無(wú)返回值的方法");
????????};
????????lambda1.test();

????????//?2.實(shí)現(xiàn)一個(gè)參數(shù),無(wú)返回值的函數(shù)式接口
????????NoneReturnSingleParameter?lambda2?=?(int?a)?->?{
????????????System.out.println("這是一個(gè)參數(shù),無(wú)返回值的方法,參數(shù)a:"?+?a);
????????};
????????lambda2.test(10);

????????//?3.實(shí)現(xiàn)多個(gè)參數(shù),無(wú)返回值的函數(shù)式接口
????????NoneReturnMutipleParameter?lambda3?=?(int?a,?int?b)?->?{
????????????System.out.println("這是多個(gè)參數(shù),無(wú)返回值的方法,參數(shù)a="?+?a?+?",b="?+?b);
????????};
????????lambda3.test(10,?20);

????????//?4.實(shí)現(xiàn)無(wú)參數(shù),有返回值有返回值的函數(shù)式接口
????????SingleReturnNoneParameter?lambda4?=?()?->?{
????????????System.out.println("這是無(wú)參數(shù),有返回值的方法,返回值是:");
????????????return?10;
????????};
????????System.out.println(lambda4.test());

????????//?5.實(shí)現(xiàn)一個(gè)參數(shù),有返回值的函數(shù)式接口
????????SingleReturnSingleParameter?lambda5?=?(int?a)?->?{
????????????System.out.println("這是一個(gè)參數(shù),有返回值的方法,返回值是:");
????????????return?a;
????????};
????????System.out.println(lambda5.test(10));

????????//?6.實(shí)現(xiàn)多個(gè)參數(shù),有返回值的函數(shù)式接口
????????SingleReturnMutipleParameter?lambda6?=?(int?a,?int?b)?->?{
????????????System.out.println("這是多個(gè)參數(shù),有返回值的方法,返回值是:");
????????????return?a?+?b;
????????};
????????System.out.println(lambda6.test(1,?2));
????}}

語(yǔ)法精簡(jiǎn)進(jìn)階:

  • 參數(shù)列表的參數(shù)類型可以省略。
  • 如果參數(shù)列表中的參數(shù)有且只有一個(gè),可以省略小括號(hào)。
  • 如果方法體中只有一條語(yǔ)句,可以省略大括號(hào)。(注:如果這條語(yǔ)句是返回語(yǔ)句,省略了大括號(hào)后也要把return關(guān)鍵字省略)

三、函數(shù)引用

lambda表達(dá)式是為了簡(jiǎn)化接口。在lambda表達(dá)式中,不應(yīng)該出現(xiàn)比較復(fù)雜的邏輯。如果需要處理的邏輯比較復(fù)雜,一般情況會(huì)單獨(dú)寫(xiě)一個(gè)方法。在lambda表達(dá)式中直接引用這個(gè)方法即可。即引用一個(gè)已經(jīng)存在的方法,使其代替lambda表達(dá)式完成接口的實(shí)現(xiàn)。

1.靜態(tài)方法引用

語(yǔ)法:類::靜態(tài)方法

  • 在引用的方法后面,不要添加小括號(hào)。
  • 引用的這個(gè)方法,參數(shù)(數(shù)量、類型)和返回值,必須要跟接口中定義的一致。
/**
?*?@Description:?方法引用
?*?@author?Guoqianliang
?*?@date?0:26?-?2021/2/16
?*/public?class?Lambda1?{

????private?static?interface?Calculate?{
????????int?calculate(int?a,?int?b);
????}

????private?static?int?calculate(int?x,?int?y)?{
????????if?(x?>?y)?{
????????????return?x?-?y;
????????}?else?if?(x?< y) {
            return y - x;
        }
        return x + y;
    }

    public static void main(String[] args) {
        // 靜態(tài)方法引用
        Calculate calculate = Lambda1::calculate;
        System.out.println(calculate.calculate(10, 20));
    }}

2.非靜態(tài)方法引用

語(yǔ)法:對(duì)象::非靜態(tài)方法

  • 在引用的方法后面,不要添加小括號(hào)。
  • 引用的這個(gè)方法,參數(shù)(數(shù)量、類型)和返回值,必須要跟接口中定義的一致。
/**
 * @Description: 方法引用
 * @author Guoqianliang
 * @date 0:26 - 2021/2/16
 */public class Lambda1 {

    private static interface Calculate {
        int calculate(int a, int b);
    }

    // 非靜態(tài)方法
    private int calculate2(int a, int b) {
        if (a != b) {
            return a - b;
        }
        return a + b;
    }

    public static void main(String[] args) {
        // 非靜態(tài)方法引用
        Calculate calculate2 = new Lambda1()::calculate2;
        System.out.println(calculate.calculate(10, 20));
    }}

3.構(gòu)造方法引用

語(yǔ)法:類名::new

  • 可以通過(guò)接口中的方法的參數(shù),區(qū)分引用不同的構(gòu)造方法。
  • 如果某一個(gè)函數(shù)式接口中定義的方法,僅僅是為了得到一個(gè)類的對(duì)象。此時(shí)就可以使用構(gòu)造方法的引用,簡(jiǎn)化這個(gè)方法的實(shí)現(xiàn)。
/**
 * @Description: 構(gòu)造方法引用
 * @author Guoqianliang
 * @date 11:20 - 2021/2/16
 */public class Lambda2 {

    @FunctionalInterface
    private interface GetPersonWithNoneParameter {
        Person get();
    }

    @FunctionalInterface
    private interface GetPersonWithSingleParameter {
        Person get(String name);
    }

    @FunctionalInterface
    private interface GetPersonWithMutipleParameter {
        Person get(String name, int age);
    }

    private static class Person {
        String name;
        int age;

        public Person() {
            System.out.println("Person類的無(wú)參構(gòu)造方法執(zhí)行了");
        }

        public Person(String name) {
            this.name = name;
            System.out.println("Person類的有參構(gòu)造方法執(zhí)行了");
        }

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println("Person類的兩個(gè)參數(shù)的構(gòu)造方法執(zhí)行了");
        }
    }

    public static void main(String[] args) {
        // 1.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithNoneParameter接口
        GetPersonWithNoneParameter getPerson = Person::new;
        // 2.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithSingleParameter接口
        GetPersonWithSingleParameter getPerson2 = Person::new;
        // 3.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithMutipleParameter接口
        GetPersonWithMutipleParameter getPerson3 = Person::new;

        System.out.println(getPerson.get());
        System.out.println(getPerson2.get("樹(shù)先生"));
        System.out.println(getPerson3.get("你好", 23));
    }}

4.對(duì)象方法的特殊引用

使用lambda表達(dá)式實(shí)現(xiàn)某些接口時(shí),如果lambda表達(dá)式中包含了某一個(gè)對(duì)象,此時(shí)方法體中,直接使用這個(gè)對(duì)象調(diào)用它的某一個(gè)方法就可以完成整體的邏輯。

/**
 * @Description: 對(duì)象方法的特殊應(yīng)用
 * @author Guoqianliang
 * @date 11:54 - 2021/2/16
 */public class Lambda3 {

    @FunctionalInterface
    private interface MyInterface {
        // String get(Person person);
        void set(Person person, String name);
    }

    private static class Person {
        private String name;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("小明");//        邏輯實(shí)現(xiàn)只是為了獲取到對(duì)象的名字//        MyInterface lambda2 = Person::getName;//        System.out.println(lambda2.get(p1));
        
        // 邏輯實(shí)現(xiàn)只是為了給對(duì)象的某些屬性進(jìn)行賦值
        MyInterface lambda1 = (x, n) ->?x.setName(n);
????????MyInterface?lambda2?=?Person::setName;
????????lambda2.set(p1,?"李華");
????????System.out.println(p1.getName());
????}}

四、Lambda表達(dá)式需要注意的問(wèn)題

如果用到局部變量,默認(rèn)會(huì)被聲明為常量,不能發(fā)生值的改變。

/**
?*?@Description:
?*?@author?Guoqianliang
?*?@date?13:05?-?2021/2/16
?*/public?class?Lambda4?{
????public?static?void?main(String[]?args)?{
????????//?1.定義一個(gè)局部變量
????????int?x?=?10;
????????//?2.使用lambda表達(dá)式實(shí)現(xiàn)接口
????????LambdaTest?lambda?=?()?->?{
????????????System.out.println("x="?+?x);
????????};
????????//?3.?無(wú)法修改常量x
????????//?x=20;
????}}@FunctionalInterfaceinterface?LambdaTest?{
????void?test();}

相關(guān)學(xué)習(xí)推薦:java基礎(chǔ)

Atas ialah kandungan terperinci 介紹Java8語(yǔ)法糖之Lambda表達(dá)式. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Agnes Tachyon Build Guide | Musume Derby Pretty
2 minggu yang lalu By Jack chen
Oguri Cap Build Guide | Musume Derby Pretty
2 minggu yang lalu By Jack chen
Puncak: Cara Menghidupkan Pemain
3 minggu yang lalu By DDD

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimanakah ungkapan lambda mengendalikan pengecualian dalam C++? Bagaimanakah ungkapan lambda mengendalikan pengecualian dalam C++? Apr 17, 2024 pm 12:42 PM

Dalam C++, terdapat dua cara untuk mengendalikan pengecualian menggunakan ungkapan Lambda: tangkap pengecualian menggunakan blok cuba-tangkap dan kendalikan atau buang semula pengecualian dalam blok tangkapan. Menggunakan fungsi pembalut jenis std::function, kaedah try_emplacenya boleh menangkap pengecualian dalam ungkapan Lambda.

Apakah maksud penutupan dalam ungkapan lambda C++? Apakah maksud penutupan dalam ungkapan lambda C++? Apr 17, 2024 pm 06:15 PM

Dalam C++, penutupan ialah ungkapan lambda yang boleh mengakses pembolehubah luaran. Untuk membuat penutupan, tangkap pembolehubah luar dalam ungkapan lambda. Penutupan memberikan kelebihan seperti kebolehgunaan semula, penyembunyian maklumat dan penilaian malas. Ia berguna dalam situasi dunia sebenar seperti pengendali acara, di mana penutupan masih boleh mengakses pembolehubah luar walaupun ia dimusnahkan.

Apakah kelebihan menggunakan ungkapan lambda C++ untuk pengaturcaraan berbilang benang? Apakah kelebihan menggunakan ungkapan lambda C++ untuk pengaturcaraan berbilang benang? Apr 17, 2024 pm 05:24 PM

Kelebihan ungkapan lambda dalam pengaturcaraan berbilang benang C++ termasuk kesederhanaan, fleksibiliti, kemudahan lulus parameter dan selari. Kes praktikal: Gunakan ungkapan lambda untuk mencipta berbilang benang dan mencetak ID benang dalam urutan yang berbeza, menunjukkan kesederhanaan dan kemudahan penggunaan kaedah ini.

Bagaimana untuk mengira tarikh setahun yang lalu atau setahun kemudian di Java 8? Bagaimana untuk mengira tarikh setahun yang lalu atau setahun kemudian di Java 8? Apr 26, 2023 am 09:22 AM

Java8 mengira tarikh setahun yang lalu atau setahun kemudian menggunakan kaedah tolak() untuk mengira tarikh setahun yang lalu packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

Bagaimana untuk melaksanakan penutupan dalam ungkapan C++ Lambda? Bagaimana untuk melaksanakan penutupan dalam ungkapan C++ Lambda? Jun 01, 2024 pm 05:50 PM

Ungkapan C++ Lambda menyokong penutupan, yang menyimpan pembolehubah skop fungsi dan menjadikannya boleh diakses oleh fungsi. Sintaks ialah [capture-list](parameters)->return-type{function-body}. capture-list mentakrifkan pembolehubah untuk ditangkap Anda boleh menggunakan [=] untuk menangkap semua pembolehubah tempatan mengikut nilai, [&] untuk menangkap semua pembolehubah tempatan melalui rujukan, atau [variable1, variable2,...] untuk menangkap pembolehubah tertentu. Ungkapan Lambda hanya boleh mengakses pembolehubah yang ditangkap tetapi tidak boleh mengubah suai nilai asal.

Panggilan fungsi C++ Ekspresi Lambda: pengoptimuman panggil balik untuk menghantar parameter dan nilai pulangan Panggilan fungsi C++ Ekspresi Lambda: pengoptimuman panggil balik untuk menghantar parameter dan nilai pulangan May 03, 2024 pm 12:12 PM

Dalam C++, anda boleh menggunakan ungkapan Lambda sebagai parameter fungsi untuk mencapai fleksibiliti fungsi panggil balik. Khususnya: Hantaran parameter: balut ungkapan Lambda melalui fungsi std:: dan hantarkannya kepada fungsi dalam bentuk penuding fungsi. Pemprosesan nilai pulangan: Tentukan jenis nilai pulangan apabila mengisytiharkan penunjuk fungsi panggil balik menggunakan fungsi std::. Kes praktikal: Optimumkan panggilan balik dalam pemprosesan acara GUI, elakkan daripada mencipta objek atau penunjuk fungsi yang tidak diperlukan dan meningkatkan kesederhanaan dan kebolehselenggaraan kod.

Bagaimanakah ungkapan lambda C++ menangkap pembolehubah luaran? Bagaimanakah ungkapan lambda C++ menangkap pembolehubah luaran? Apr 17, 2024 pm 04:39 PM

Terdapat tiga cara untuk menangkap ungkapan lambda pembolehubah luaran dalam C++: Tangkap mengikut nilai: Buat salinan pembolehubah. Tangkap melalui rujukan: Dapatkan rujukan berubah-ubah. Tangkap mengikut nilai dan rujukan serentak: Membenarkan tangkapan berbilang pembolehubah, sama ada mengikut nilai atau rujukan.

Bagaimana untuk melakukan penilaian malas menggunakan ungkapan lambda C++? Bagaimana untuk melakukan penilaian malas menggunakan ungkapan lambda C++? Apr 17, 2024 pm 12:36 PM

Bagaimana untuk melakukan penilaian malas menggunakan ungkapan lambda C++? Gunakan ungkapan lambda untuk mencipta objek fungsi yang dinilai dengan malas. Pengiraan tertunda menangguhkan pelaksanaan sehingga diperlukan. Kira keputusan hanya apabila diperlukan, meningkatkan prestasi.

See all articles