亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Lambda表達(dá)式入門

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

導(dǎo)讀

1、前言

2、Lambda類型

3、Lambda的域以及訪問限制

4、內(nèi)置函數(shù)式接口

5、方法引用

6、靜態(tài)方法引用

7、實例方法引用

8、對象方法引用

9、構(gòu)造方法引用

10、總結(jié)


一、前言

上一篇介紹了lambda表達(dá)式的語法,今天繼續(xù)介紹。


二、Lambda類型

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

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

舉例如下:

@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接口,聲明了兩個方法,好像不符合函數(shù)接口的定義,但Comparator確實是函數(shù)接口。這個是因為equals方法是Object的,所有的接口都會聲明Object的public方法(雖然大多是隱式的)。所以,Comparator顯式的聲明了equals不影響它依然是個函數(shù)接口。

雖然Lambda雖然可以當(dāng)作是Object類型,但需要顯式轉(zhuǎn)換才行。

我們可以用一個Lambda表達(dá)式為一個函數(shù)接口賦值:

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!

必須顯式的轉(zhuǎn)型成一個函數(shù)接口才可以:

object o = (Runnable) () -> {

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

};

-個Lambda表達(dá)式只有在轉(zhuǎn)型成一個函數(shù)接口后才能被當(dāng)做Object使用。所以下面這句也不能編譯:

//錯誤! 目標(biāo)類型不明

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

必須先轉(zhuǎn)型:

system.out.println(

  (Runnable)() -> {}

); // 正確

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

@FunctionalInterface

public interface MyRunnable{

  public void run();

}

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

Runnable r1 = () -> {

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

};


MyRunnable r2 = () -> {

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

};

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

但需注意一個Lambda表達(dá)式必須至少有一個目標(biāo)類型。


三、Lambda的域及訪問限制

域即作用域,Lambda表達(dá)式中的參數(shù)列表中的參數(shù)在該Lambda表達(dá)式范圍內(nèi)(域)有效。

在作用Lambda表達(dá)式內(nèi),可以訪問外部的變量:局部變量、類變量和靜態(tài)變量,但操作受限程度不一。

1、訪問局部變量

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

2、訪問靜態(tài)變量和成員變量

在Lambda表達(dá)式內(nèi)部,對靜態(tài)變量和成員變量可讀可寫


四、內(nèi)置函數(shù)式接口

小伙伴們有沒有發(fā)現(xiàn),如果使用Lambda表達(dá)式,還是需要我們自己寫一個接口定義的,其實很多接口無非是入?yún)㈩愋秃头祷刂挡灰粯佣?/strong>,所以Java給我們提供了幾個常用的標(biāo)準(zhǔn)函數(shù)接口:

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

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

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

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

1、Consumer<T>消費型接口

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

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

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

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

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

我們發(fā)現(xiàn)和內(nèi)置函數(shù)接口,沒有什么區(qū)別,就是接口名和方法名稱不一樣而已,其實本質(zhì)是一樣的,這就是為什么Java會提供一些內(nèi)置的函數(shù),這樣可以減少大量的代碼。

2、Supplier<T>供給型接口

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

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

3、Function<T, R>函數(shù)式接口

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

接口實現(xiàn)轉(zhuǎn)換成大寫的字符。

4、Predicate<T>斷言型接口

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

內(nèi)置的函數(shù)接口,大大的提高開發(fā)的效率,減少了開發(fā)代碼


五、方法引用

方法引用是Lambda表達(dá)式的一個簡化寫法其語法結(jié)構(gòu)為

ObjectRef::methodName

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

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


六、靜態(tài)方法引用

先上一個案例

上面的代碼中,我們發(fā)現(xiàn)Converter匿名類重載方法中,調(diào)用了ReferenceTest的靜態(tài)方法String2Int。再有函數(shù)接口的方法參數(shù)類型 和 返回值類型,跟String2Int是一樣的,入?yún)镾tring,返回值為Integer。那我們這個時候可以簡化成

直接用靜態(tài)方法進(jìn)行賦值,是不是很簡潔。


七、實例方法引用

如果函數(shù)式接口的實現(xiàn)恰好可以通過調(diào)用一個實例的實例方法來實現(xiàn),那么就可以使用實例方法引用

?


八、對象方法引用

抽象方法的第一個參數(shù)類型剛好是實例方法的類型(函數(shù)式接口的抽象方法必須要有輸入?yún)?shù))抽象方法剩余的參數(shù)恰好可以當(dāng)做實例方法的參數(shù)。

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

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


九、構(gòu)造方法引用

如果函數(shù)式接口的實現(xiàn)恰好可以通過調(diào)用一個類的構(gòu)造方法來實現(xiàn),那么就可以使用構(gòu)造方法引用,語法【類名::new】

上面是無參數(shù)的構(gòu)造函數(shù),再來看看有參構(gòu)造函數(shù)

到這里,來個方法引用的總結(jié):


十、總結(jié)

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


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


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