亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java基礎 介紹Java8語法糖之Lambda表達式

介紹Java8語法糖之Lambda表達式

Feb 18, 2021 pm 06:09 PM
java8 lambda

介紹Java8語法糖之Lambda表達式

免費學習推薦:java基礎教程

一、Lambda表達式簡介

Lambda表達式,是Java8的一個新特性,也是Java8中最值得學習的新特性之一。(另一個新特性是流式編程。)

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

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

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

@FunctionalInterface注解 ,用在接口之前,用來判斷接口是否是一個函數(shù)式接口。如果不是函數(shù)式接口會報錯。功能類似于@Override。

二、Lambda表達式語法

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

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

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

在這里插入圖片描述

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

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

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

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

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

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

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

語法精簡進階:

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

三、函數(shù)引用

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

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

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

  • 在引用的方法后面,不要添加小括號。
  • 引用的這個方法,參數(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)方法引用

語法:對象::非靜態(tài)方法

  • 在引用的方法后面,不要添加小括號。
  • 引用的這個方法,參數(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)造方法引用

語法:類名::new

  • 可以通過接口中的方法的參數(shù),區(qū)分引用不同的構(gòu)造方法。
  • 如果某一個函數(shù)式接口中定義的方法,僅僅是為了得到一個類的對象。此時就可以使用構(gòu)造方法的引用,簡化這個方法的實現(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類的無參構(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類的兩個參數(shù)的構(gòu)造方法執(zhí)行了");
        }
    }

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

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

4.對象方法的特殊引用

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

/**
 * @Description: 對象方法的特殊應用
 * @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("小明");//        邏輯實現(xiàn)只是為了獲取到對象的名字//        MyInterface lambda2 = Person::getName;//        System.out.println(lambda2.get(p1));
        
        // 邏輯實現(xiàn)只是為了給對象的某些屬性進行賦值
        MyInterface lambda1 = (x, n) ->?x.setName(n);
????????MyInterface?lambda2?=?Person::setName;
????????lambda2.set(p1,?"李華");
????????System.out.println(p1.getName());
????}}

四、Lambda表達式需要注意的問題

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

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

相關(guān)學習推薦:java基礎

以上是介紹Java8語法糖之Lambda表達式的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
lambda 表達式在 C++ 中如何處理異常? lambda 表達式在 C++ 中如何處理異常? Apr 17, 2024 pm 12:42 PM

在C++中,使用Lambda表達式處理異常有兩種方法:使用try-catch塊捕獲異常,并在catch塊中處理或重新拋出異常。使用std::function類型的包裝函數(shù),其try_emplace方法可以捕獲Lambda表達式中的異常。

C++ lambda 表達式中閉包的含義是什么? C++ lambda 表達式中閉包的含義是什么? Apr 17, 2024 pm 06:15 PM

在C++中,閉包是能夠訪問外部變量的lambda表達式。要創(chuàng)建閉包,請捕獲lambda表達式中的外部變量。閉包提供可復用性、信息隱藏和延遲求值等優(yōu)勢。它們在事件處理程序等實際情況中很有用,其中即使外部變量被銷毀,閉包仍然可以訪問它們。

用 C++ lambda 表達式實現(xiàn)多線程編程的優(yōu)勢是什么? 用 C++ lambda 表達式實現(xiàn)多線程編程的優(yōu)勢是什么? Apr 17, 2024 pm 05:24 PM

lambda表達式在C++多線程編程中的優(yōu)勢包括:簡潔性、靈活性、易于傳參和并行性。實戰(zhàn)案例:使用lambda表達式創(chuàng)建多線程??,在不同線程中打印線程ID,展示了該方法的簡潔和易用性。

Java 8中如何計算一年前或一年后的日期? Java 8中如何計算一年前或一年后的日期? Apr 26, 2023 am 09:22 AM

Java8計算一年前或一年后的日期利用minus()方法計算一年前的日期packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[]args){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

C++ 函數(shù)調(diào)用 Lambda 表達式:參數(shù)傳遞和返回值的回調(diào)優(yōu)化 C++ 函數(shù)調(diào)用 Lambda 表達式:參數(shù)傳遞和返回值的回調(diào)優(yōu)化 May 03, 2024 pm 12:12 PM

在C++中,可以使用Lambda表達式作為函數(shù)參數(shù),實現(xiàn)回調(diào)函數(shù)的靈活性。具體而言:參數(shù)傳遞:通過std::function包裝Lambda表達式,以函數(shù)指針形式傳遞給函數(shù)。返回值處理:使用std::function聲明回調(diào)函數(shù)指針時指定返回值類型。實戰(zhàn)案例:優(yōu)化GUI事件處理中的回調(diào),避免創(chuàng)建不必要的對象或函數(shù)指針,提高代碼簡潔性和可維護性。

C++ Lambda 表達式如何實現(xiàn)閉包? C++ Lambda 表達式如何實現(xiàn)閉包? Jun 01, 2024 pm 05:50 PM

C++Lambda表達式支持閉包,即保存函數(shù)作用域變量并供函數(shù)訪問。語法為[capture-list](parameters)->return-type{function-body}。capture-list定義要捕獲的變量,可以使用[=]按值捕獲所有局部變量,[&]按引用捕獲所有局部變量,或[variable1,variable2,...]捕獲特定變量。Lambda表達式只能訪問捕獲的變量,但無法修改原始值。

C++ lambda 表達式如何捕獲外部變量? C++ lambda 表達式如何捕獲外部變量? Apr 17, 2024 pm 04:39 PM

在C++中捕獲外部變量的lambda表達式有三種方法:按值捕獲:創(chuàng)建一個變量副本。按引用捕獲:獲得變量引用。同時按值和引用捕獲:允許捕獲多個變量,按值或按引用。

如何使用 C++ lambda 表達式執(zhí)行延遲求值? 如何使用 C++ lambda 表達式執(zhí)行延遲求值? Apr 17, 2024 pm 12:36 PM

如何使用C++lambda表達式執(zhí)行延遲求值?使用lambda表達式創(chuàng)建延遲求值的函數(shù)對象。延遲計算推遲到需要時才執(zhí)行。僅當需要時才計算結(jié)果,提高性能。

See all articles