欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你看懂Java8中的lambda表達式和方法引用

 更新時間:2023年12月05日 08:49:00   作者:星夜晚晚  
Lambda 表達式是 Java 8 引入的一項重要特性,它提供了一種簡潔、清晰且靈活的語法來表示可傳遞的匿名函數(shù),下面就跟隨小編一起學習一下Java8中的lambda表達式和方法引用的相關知識吧

上一篇文章介紹Consumer接口時講到lambda表達式和方法引用,這里順便將這兩個講一下。

Lambda 表達式是 Java 8 引入的一項重要特性,它提供了一種簡潔、清晰且靈活的語法來表示可傳遞的匿名函數(shù)。Lambda 表達式是一種語法糖,提供了一種更簡潔的語法來實例化函數(shù)式接口(Functional Interface)。

基本語法

Lambda 表達式的基本語法如下:

(parameters) -> expression

(parameters) -> { statements; }

其中:

  • parameters 指的是 Lambda 表達式的參數(shù)列表。
  • -> 是 Lambda 運算符,它將參數(shù)列表與 Lambda 表達式的主體分開。
  • expression 是 Lambda 表達式的返回表達式。
  • {} 內包含了 Lambda 表達式的代碼塊,可以包含多個語句。

示例

以下是一些 Lambda 表達式的示例:

不帶參數(shù)的 Lambda 表達式:

() -> System.out.println("Hello, Lambda!");

帶參數(shù)的 Lambda 表達式:

(int x, int y) -> x + y

帶參數(shù)和代碼塊的 Lambda 表達式:

(String s) -> {
    System.out.println(s);
    // 可以包含多個語句
}

使用場景

Lambda 表達式通常用于函數(shù)式接口的實例化,即接口中只有一個抽象方法的情況。例如,RunnableCallable、Comparator 等接口都是函數(shù)式接口,可以通過 Lambda 表達式來實例化。

// 使用 Lambda 表達式實例化 Runnable
Runnable myRunnable = () -> System.out.println("Hello, Lambda!");

// 使用 Lambda 表達式實例化 Comparator
Comparator<String> myComparator = (s1, s2) -> s1.compareTo(s2);

本質

雖然 Lambda 表達式的語法看起來像是一個函數(shù),但實際上它在 Java 中被實現(xiàn)為一個對象,是一個匿名的內部類對象。這個對象的類型是由編譯器根據(jù)上下文和目標類型進行推導的。這個對象可以被賦值給相應的函數(shù)式接口。 在講Consumer接口時,我們的一個例子。

import java.util.function.Consumer;

public class ConsumerExample {

    public static void main(String[] args) {
        // 創(chuàng)建一個Consumer實例
        Consumer<String> myConsumer = s -> System.out.println(s);

        // 使用Consumer的accept方法
        myConsumer.accept("Hello, Consumer!");
    }
}

首先s -> System.out.println(s)是lambda表達式,本質是一個只含有一個方法的匿名內部類對象。它的演化流程是,定義一個函數(shù)式接口

interface MyFunctionalInterface {
    void myMethod(String s);
}

然后使用匿名內部類(這個內部類實現(xiàn)這個函數(shù)式接口,編寫抽象方法的邏輯),并實例化這個對象,由于java的多態(tài)特點,父類引用可以指向子類對象,因此父類引用MyFunctionalInterface可以指向新的接口實例化后的對象。

MyFunctionalInterface myFunction = new MyFunctionalInterface() {
    @Override
    public void myMethod(String s) {
        // 實現(xiàn)接口中的方法,比如
        System.out.println(s);
    }
};

這樣的寫法弊端是語法冗長,代碼顯得不夠簡潔。Lambda 表達式的引入就是為了解決這個問題,讓代碼更加緊湊和易讀。使用 Lambda 表達式,上面的代碼可以被簡化為:

MyFunctionalInterface myFunction =(String s)-> System.out.println(s);

當 Lambda 表達式只有一個參數(shù)時,可以省略參數(shù)的括號。而且當上下文可以推斷出類型時,參數(shù)的類型也可以省略。最終變?yōu)椋?/p>

 Consumer<String> myConsumer = s -> System.out.println(s);

java泛型來推斷s的類型為String

Consumer本身就是一個函數(shù)式接口,所以此處System.out.println(s)就是Consumer中抽象方法accept的實現(xiàn)邏輯。示例中的MyFunctionalInterface其實就是Consumer,或者經(jīng)過編譯器推斷,這個函數(shù)式接口就是Consumer

方法引用

Lambda 表達式的一個變體是方法引用,它允許你直接引用已有的方法。例如:

// 使用靜態(tài)方法引用
Function<String, Integer> toInt = Integer::parseInt;

// 使用實例方法引用
List<String> list = Arrays.asList("1", "2", "3");
list.forEach(System.out::println);

這里 Integer::parseInt 是一個靜態(tài)方法引用,System.out::println 是一個實例方法引用。

有四種主要的方法引用的形式:

靜態(tài)方法引用(Static Method Reference): ClassName::staticMethodName

實例方法引用(Instance Method Reference):

  • 對于特定對象的實例方法:instance::instanceMethodName
  • 對于任意對象的實例方法:ClassName::instanceMethodName

構造方法引用(Constructor Reference): ClassName::new

數(shù)組構造方法引用(Array Constructor Reference): TypeName[]::new

Lambda 表達式的優(yōu)勢

  • 簡潔性: Lambda 表達式可以減少冗余的代碼,使代碼更加簡潔和易讀。
  • 函數(shù)式編程: 提供了函數(shù)式編程的支持,使得在Java中更容易使用函數(shù)作為一等公民。
  • 并行處理: 可以更容易地實現(xiàn)并行處理,通過并行流等特性,提高程序的性能。

Lambda 表達式是 Java 8 引入的一項重要特性,它在編寫簡潔、清晰的代碼和支持函數(shù)式編程方面起到了關鍵作用。方法引用是Lambda 表達式的變體。

以上就是一文帶你看懂Java8中的lambda表達式和方法引用的詳細內容,更多關于Java8 lambda表達式的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot實現(xiàn)kafka多源配置的示例代碼

    SpringBoot實現(xiàn)kafka多源配置的示例代碼

    實際開發(fā)中,不同的topic可能來自不同的集群,所以就需要配置不同的kafka數(shù)據(jù)源,基于springboot自動配置的思想,最終通過配置文件的配置,自動生成生產(chǎn)者及消費者的配置,本文介紹了SpringBoot實現(xiàn)kafka多源配置,需要的朋友可以參考下
    2024-06-06
  • Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringSecurity整合springBoot、redis實現(xiàn)登錄互踢功能

    SpringSecurity整合springBoot、redis實現(xiàn)登錄互踢功能

    這篇文章主要介紹了SpringSecurity整合springBoot、redis實現(xiàn)登錄互踢,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • SpringMVC一步到位精通攔截器

    SpringMVC一步到位精通攔截器

    攔截器(Interceptor)是一種動態(tài)攔截方法調用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2022-12-12
  • SpringBoot入門實現(xiàn)第一個SpringBoot項目

    SpringBoot入門實現(xiàn)第一個SpringBoot項目

    今天我們一起來完成一個簡單的SpringBoot(Hello World)。就把他作為你的第一個SpringBoot項目。具有一定的參考價值,感興趣的可以了解一下
    2021-09-09
  • Java實現(xiàn)桌面日歷

    Java實現(xiàn)桌面日歷

    這篇文章主要為大家詳細介紹了Java實現(xiàn)桌面日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java定長隊列的實現(xiàn)示例

    java定長隊列的實現(xiàn)示例

    定長隊列是一種有限容量的隊列,對于某些應用場景非常有用,本文主要介紹了java定長隊列的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Java實現(xiàn)Ip地址獲取的示例代碼

    Java實現(xiàn)Ip地址獲取的示例代碼

    這篇文章主要為大家詳細介紹了Java實現(xiàn)Ip地址獲取的兩種方式,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2023-09-09
  • JVM解密之解構類加載與GC垃圾回收機制詳解

    JVM解密之解構類加載與GC垃圾回收機制詳解

    本文主要介紹了Java虛擬機(JVM)的內存劃分、類加載機制以及垃圾回收機制,JVM的內存劃分為程序計數(shù)器、棧、堆和方法區(qū),類加載機制包括類加載過程、加載器模型和雙親委派模型,垃圾回收機制主要包括標記-清除、標記-復制、標記-整理和分代回收算法
    2025-02-02
  • Springboot項目與vue項目整合打包的實現(xiàn)方式

    Springboot項目與vue項目整合打包的實現(xiàn)方式

    這篇文章主要介紹了Springboot項目與vue項目整合打包的實現(xiàn)方式,本文通過兩種方式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07

最新評論