午夜视频在线观看区二区-午夜视频在线观看视频-午夜视频在线观看视频在线观看-午夜视频在线观看完整高清在线-午夜视频在线观看网站-午夜视频在线观看亚洲天堂

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Lambda表達式入門

admin
2025年2月25日 10:33 本文熱度 382

導讀

1、前言

2、Lambda類型

3、Lambda的域以及訪問限制

4、內置函數式接口

5、方法引用

6、靜態方法引用

7、實例方法引用

8、對象方法引用

9、構造方法引用

10、總結


一、前言

上一篇介紹了lambda表達式的語法,今天繼續介紹。


二、Lambda類型

Lambda表達式可以被當做是一個Object。Lambda表達式的類型,叫做“目標類型(target type)”。Lambda表達式的目標類型是“函數接口(functionalinterface)”

有一個接口,如果只有一個顯式聲明的抽象方法,那么它就是一個函數接口。一般用@Functionallnterface標注出來(也可以不標)。

舉例如下:

@FunctionalInterface

public interface Runnable { void run();}

public interface Callable<V>{V call() throws Exception; }

public interface ActionListener { void actionPerformed(ActionEvent e); }

public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }

我們看到最后的Comparator接口,聲明了兩個方法,好像不符合函數接口的定義,但Comparator確實是函數接口。這個是因為equals方法是Object的,所有的接口都會聲明Object的public方法(雖然大多是隱式的)。所以,Comparator顯式的聲明了equals不影響它依然是個函數接口

雖然Lambda雖然可以當作是Object類型,但需要顯式轉換才行。

我們可以用一個Lambda表達式為一個函數接口賦值:

Runnable r1 = () -> {

  system.out.println("Hello Lambda!");

};

然后再賦值給一個Object:

object obj = r1;

但卻不能這樣干:

object obj = () -> {

  system.out.println("Hello Lambda!");

};

// ERROR! object is not a functional interface!

必須顯式的轉型成一個函數接口才可以:

object o = (Runnable) () -> {

  System.out.println("Hello Lambda!");

};

-個Lambda表達式只有在轉型成一個函數接口后才能被當做Object使用。所以下面這句也不能編譯:

//錯誤! 目標類型不明

system.out.println( () -> {} );

必須先轉型:

system.out.println(

  (Runnable)() -> {}

); // 正確

我們可以定義一個無參數,無返回值的接口,類似Runnable

@FunctionalInterface

public interface MyRunnable{

  public void run();

}

那下面的寫法,都是正確的

Runnable r1 = () -> {

  System.out.println("Hello Lambda!");

};


MyRunnable r2 = () -> {

  System.out.println("Hello Lambda!");

};

這說明一個Lambda表達式可以有多個目標類型(函數接口),只要函數匹配成功即可。

但需注意一個Lambda表達式必須至少有一個目標類型


三、Lambda的域及訪問限制

域即作用域,Lambda表達式中的參數列表中的參數在該Lambda表達式范圍內(域)有效。

在作用Lambda表達式內,可以訪問外部的變量:局部變量、類變量和靜態變量,但操作受限程度不一。

1、訪問局部變量

在Lambda表達式外部的局部變量會被JVM隱式的編譯成final類型,因此只能訪問外而不能修改。

2、訪問靜態變量和成員變量

在Lambda表達式內部,對靜態變量和成員變量可讀可寫


四、內置函數式接口

小伙伴們有沒有發現,如果使用Lambda表達式,還是需要我們自己寫一個接口定義的其實很多接口無非是入參類型和返回值不一樣而已,所以Java給我們提供了幾個常用的標準函數接口:

Consumer<T>con 消費型接口: void accept(Tt);

Supplier<T>sup 供給型接口: Tget();

Function<T,R>fun 函數型接口: R apply(Tt);

Predicate<T>: 斷言型接口:boolean test(Tt);

1、Consumer<T>消費型接口

接口中的方法為 void accept(Tt),1個參數,無返回值。調用方要傳入值,而不需要返回,形象比喻成消費型

這個就是對傳入num參數值,進行相關的處理(消費)。到底進行處理,具體就在

(num) -> System.out.println("消費了" + num)

上面的代碼中,是一個典型的1個參數,無返回值的消費;如果沒有內置的函數接口,那我們就需要自己定義一個,如:

interface MyConsumer<T>{    void doFunction(T t)}

我們發現和內置函數接口,沒有什么區別,就是接口名和方法名稱不一樣而已,其實本質是一樣的,這就是為什么Java會提供一些內置的函數,這樣可以減少大量的代碼。

2、Supplier<T>供給型接口

接口中的方法Tget(),無參數,有返回值;不需要對方給參數,而是一直返回給對方,形象定義為供給型接口

上面代碼就是返回一個新的實體對象。

3、Function<T, R>函數式接口

接口中的方法 R apply (T t),有參數,有返回值;典型的函數,所以形象比喻成函數型接口

接口實現轉換成大寫的字符。

4、Predicate<T>斷言型接口

接口中方法 boolean test(T t),有參數,返回boolean,是一個條件檢查式方法,比喻成斷言型接口

內置的函數接口,大大的提高開發的效率,減少了開發代碼


五、方法引用

方法引用是Lambda表達式的一個簡化寫法其語法結構為

ObjectRef::methodName

左邊可以是類名或者實例名,中間是方法引用符號“::”,右邊是相應的方法名。方法引用可以分為三類。

使用前提:Lambda體中調用方法的參數列表和返回值類型,要和函數式接口中抽象方法的參數列表和返回值類型保持一致。


六、靜態方法引用

先上一個案例

上面的代碼中,我們發現Converter匿名類重載方法中,調用了ReferenceTest的靜態方法String2Int。再有函數接口的方法參數類型 和 返回值類型,跟String2Int是一樣的,入參為String,返回值為Integer。那我們這個時候可以簡化成

直接用靜態方法進行賦值,是不是很簡潔。


七、實例方法引用

如果函數式接口的實現恰好可以通過調用一個實例的實例方法來實現,那么就可以使用實例方法引用

?


八、對象方法引用

抽象方法的第一個參數類型剛好是實例方法的類型(函數式接口的抽象方法必須要有輸入參數)抽象方法剩余的參數恰好可以當做實例方法的參數

如果函數式接口的實現能由上面說的實例方法調用來實現的話,那么就可以使用對象方法的引用(兩個條件都要滿足)

我們看到第一參數Prod s,和實例對象new Prod是同一個類型;剩余的參數s1,正好是實例方法fun的參數;這樣就可以簡化成Prod::fun


九、構造方法引用

如果函數式接口的實現恰好可以通過調用一個類的構造方法來實現,那么就可以使用構造方法引用,語法【類名::new】

上面是無參數的構造函數,再來看看有參構造函數

到這里,來個方法引用的總結:


十、總結

Lambda表達式要熟練掌握,是要小伙伴們經常去寫,才能夠運用自如,代碼雖然比較簡潔,但確實沒有接觸的開發人員看上去,就懵逼了,可讀性不強


閱讀原文:https://mp.weixin.qq.com/s/QhjAC15Y1w0evnRFu8BgDw


該文章在 2025/2/25 17:11:33 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产精品国语刺激对白在线观看 | 岛国一区二区三区在线观看免费 | 国产放荡对 | 国产福利一区 | 国产无码成本人电影 | 精品麻豆高清一区二区 | 高清一区二区三区不卡免费 | 精品久久久久久久无码中文 | 国产激情三级在线观看 | 国产自产在线观 | 99精品国产兔费观看久久 | 国语对白精品一区二区在线观看 | 国产精品白浆在线观看无码专区 | 国产精品一区视频 | 18精品爽国产白嫩精品 | 国产精品va尤物在线观看蜜芽 | 国产麻豆蜜桃色精 | 国产一区二区三区在线视频 | 国产高清不卡在线 | 国产极品白嫩精品 | 国产区免费在线观看 | 2025亚洲精品无码在钱 | 国产福利麻豆精 | www亚洲精品少妇裸乳一区 | 国产3级在线高清手机在线播放 | h无码无修动漫在线观看 | 91在线国产专区精品 | 国产精品户外野外 | 国产成人小午夜视频在线观看 | 91人妻精品一区二区三区蜜桃 | 超大乳抖乳露双乳呻吟 | 国产a级毛片久久久久久 | 国产高清不卡无码视频 | 国产成人精品亚洲日本 | 国产熟女亚洲精品麻豆 | 国产成人免费高清直播软件 | 高潮一区二区三区在线 | 精品无码一区二区三区黄 | 国产精品白浆无码流出在线观看 | 国产欧美成人精品 | 91国自产拍精品 |