最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

基本語法

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

(parameters) -> expression

(parameters) -> { statements; }

其中:

  • parameters 指的是 Lambda 表達式的參數(shù)列表。
  • -> 是 Lambda 運算符,它將參數(shù)列表與 Lambda 表達式的主體分開。
  • expression 是 Lambda 表達式的返回表達式。
  • {} 內(nèi)包含了 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ù)式接口的實例化,即接口中只有一個抽象方法的情況。例如,Runnable、Callable、Comparator 等接口都是函數(shù)式接口,可以通過 Lambda 表達式來實例化。

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

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

本質(zhì)

雖然 Lambda 表達式的語法看起來像是一個函數(shù),但實際上它在 Java 中被實現(xiàn)為一個對象,是一個匿名的內(nèi)部類對象。這個對象的類型是由編譯器根據(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表達式,本質(zhì)是一個只含有一個方法的匿名內(nèi)部類對象。它的演化流程是,定義一個函數(shù)式接口

interface MyFunctionalInterface {
    void myMethod(String s);
}

然后使用匿名內(nèi)部類(這個內(nèi)部類實現(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

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

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

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

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

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

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

相關(guān)文章

  • SpringBoot整合Mybatis及遇到的坑與解決過程

    SpringBoot整合Mybatis及遇到的坑與解決過程

    該文章詳細介紹了如何配置和使用MyBatis Generator插件生成代碼,包括創(chuàng)建項目、修改POM文件、配置數(shù)據(jù)源、添加Maven插件、配置資源拷貝插件、添加用戶功能以及解決遇到的錯誤
    2026-01-01
  • Java中的源文件、字節(jié)碼文件解讀

    Java中的源文件、字節(jié)碼文件解讀

    這篇文章主要介紹了Java中的源文件、字節(jié)碼文件,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 由淺到深帶你詳談Java實現(xiàn)數(shù)組擴容的三種方式

    由淺到深帶你詳談Java實現(xiàn)數(shù)組擴容的三種方式

    這篇文章主要詳細介紹了Java實現(xiàn)數(shù)組擴容的三種方式,新建一個數(shù)組,把原來數(shù)組的內(nèi)容搬到新數(shù)組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價值,需要的朋友可以借鑒一下
    2023-06-06
  • java實現(xiàn)/創(chuàng)建線程的幾種方式小結(jié)

    java實現(xiàn)/創(chuàng)建線程的幾種方式小結(jié)

    在JAVA中,用Thread類代表線程,所有線程對象都必須是Thread類或者Thread類子類的實例,下面這篇文章主要介紹了java實現(xiàn)/創(chuàng)建線程的幾種方式,需要的朋友可以參考下
    2021-08-08
  • controller函數(shù)中參數(shù)列表使用多個@RequestBody問題

    controller函數(shù)中參數(shù)列表使用多個@RequestBody問題

    這篇文章主要介紹了controller函數(shù)中參數(shù)列表使用多個@RequestBody問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java HashMap通過value反查key的代碼示例

    java HashMap通過value反查key的代碼示例

    本文講解了java HashMap通過value反查key的方法,直接提供代碼供大家參考使用
    2013-11-11
  • idea批量啟動多個微服務具體實現(xiàn)

    idea批量啟動多個微服務具體實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于idea批量啟動多個微服務的具體實現(xiàn),在微服務開發(fā)過程中,我們經(jīng)常要在本地啟動很多個微服務,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • RestTemplate報錯400 Bad Request的解決方案

    RestTemplate報錯400 Bad Request的解決方案

    在使用Spring Boot時,若直接通過@Autowired注入RestTemplate可能會遇到400BadRequest錯誤,原因在于Spring Boot官方文檔指出,由于RestTemplate實例通常需要在使用前進行定制,因此Spring Boot不會自動配置單個RestTemplate Bean
    2024-11-11
  • Java多線程中的ThreadLocal應用場景及問題解讀

    Java多線程中的ThreadLocal應用場景及問題解讀

    這篇文章主要介紹了Java多線程中的ThreadLocal應用場景及問題解讀,ThreadLocal這個類在多線程并發(fā)中主要的使用場景是什么呢,我們都知道多線程并發(fā)問題實際就是多個線程對公共資源訪問和修改問題,需要的朋友可以參考下
    2023-12-12
  • Java核心技術(shù)之反射

    Java核心技術(shù)之反射

    本文非常詳細的講解了java反射的相關(guān)資料,java反射在現(xiàn)今的使用中很頻繁,希望此文可以幫大家解答疑惑,可以幫助大家理解
    2021-11-11

最新評論

宜川县| 罗定市| 贞丰县| 广元市| 长汀县| 宝清县| 宜城市| 云和县| 鄂伦春自治旗| 西乡县| 德江县| 东港市| 彭山县| 广灵县| 枞阳县| 通海县| 修水县| 鄄城县| 华坪县| 永清县| 静乐县| 沙坪坝区| 大关县| 合肥市| 五大连池市| 渑池县| 平塘县| 沈丘县| 凉城县| 开封县| 红河县| 拜泉县| 尚义县| 丰城市| 三亚市| 临汾市| 浦县| 集安市| 东港市| 儋州市| 深圳市|