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

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

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

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

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

基本語法

Lambda 表達(dá)式的基本語法如下:

(parameters) -> expression

(parameters) -> { statements; }

其中:

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

示例

以下是一些 Lambda 表達(dá)式的示例:

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

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

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

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

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

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

使用場(chǎng)景

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

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

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

本質(zhì)

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

import java.util.function.Consumer;

public class ConsumerExample {

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

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

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

interface MyFunctionalInterface {
    void myMethod(String s);
}

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

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

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

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

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

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

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

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

方法引用

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

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

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

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

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

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

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

  • 對(duì)于特定對(duì)象的實(shí)例方法:instance::instanceMethodName
  • 對(duì)于任意對(duì)象的實(shí)例方法:ClassName::instanceMethodName

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

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

Lambda 表達(dá)式的優(yōu)勢(shì)

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    idea批量啟動(dòng)多個(gè)微服務(wù)具體實(shí)現(xiàn)

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

    RestTemplate報(bào)錯(cuò)400 Bad Request的解決方案

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

    Java多線程中的ThreadLocal應(yīng)用場(chǎng)景及問題解讀

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

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

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

最新評(píng)論

土默特右旗| 通江县| 开江县| 武山县| 泸溪县| 北流市| 洪江市| 阳谷县| 西林县| 南江县| 德安县| 历史| 哈密市| 玉林市| 济阳县| 崇明县| 灵寿县| 江津市| 东海县| 疏附县| 盐池县| 濉溪县| 轮台县| 礼泉县| 五河县| 云龙县| 如东县| 射洪县| 武邑县| 荥阳市| 桓台县| 永德县| 卓资县| 项城市| 东乡族自治县| 朝阳市| 桂平市| 岳普湖县| 新余市| 鹤山市| 加查县|