Java的Lambda表達(dá)式和Stream流的作用以及示例
Lambda介紹
- java8新特性
- Lambda表達(dá)式是一個(gè)匿名函數(shù),有以下特性:
- a. 通過(guò)使用Lambda表達(dá)式使代碼簡(jiǎn)潔、緊湊
- b. 匿名函數(shù)可以作為參數(shù)、返回值。
Lambda語(yǔ)法格式
(parameters)->{statements;}
parameters:參數(shù)列表。
- statements:執(zhí)行語(yǔ)句。
->:使用指定參數(shù)完成某個(gè)功能。 - (parameters)->expression
parameters:參數(shù)列表。
expression:表達(dá)式。
->:使用指定參數(shù)完成某個(gè)功能。
使用細(xì)節(jié)
- 可選的大括號(hào):函數(shù)體只包含一個(gè)語(yǔ)句,不需要大括號(hào)。
(String msg) -> System.out.println(msg);
- 可選的參數(shù)圓括號(hào):只有一個(gè)參數(shù),省略圓括號(hào)及參數(shù)類(lèi)型。
(msg) -> System.out.println(msg);
- 可選的返回關(guān)鍵字return:函數(shù)體只有一個(gè)表達(dá)式,且運(yùn)算結(jié)果匹配返回類(lèi)型,省略return。
(int a,int b) -> a+b
- 可選的參數(shù)類(lèi)型:不需要參數(shù)類(lèi)型,編譯器可以根據(jù)參數(shù)值進(jìn)行推斷。
(a,b)-> a+b
Lambda方法引用
當(dāng)Lambda表達(dá)式所要完成的業(yè)務(wù)邏輯已經(jīng)存在,直接引用對(duì)應(yīng)的方法。 被引用的方法與函數(shù)式抽象方法:參數(shù)列表要相同、返回值類(lèi)型兼容。
語(yǔ)法格式
通過(guò)雙冒號(hào):: 進(jìn)行方法引用
哪些方法可以引用
- 靜態(tài)方法 通過(guò) 類(lèi)名::方法 引用,如示例,Test::run 會(huì)引用到Test類(lèi)的run(),且與Runnable接口中的run方法參數(shù)、返回值相同。
public class Test {
public static void main(String[] args) {
new Thread(Test::run).start();
}
private static void run() {
System.out.println("執(zhí)行業(yè)務(wù)");
}
}- 構(gòu)造方法 聲明User類(lèi)
public class User {
public User(){}
}聲明函數(shù)接口
@FunctionalInterface
public interface HelloLambda {
public User get();
}通過(guò) 類(lèi)名::new 引用
public class Test {
public static User get(HelloLambda helloLambda) {
return helloLambda.get();
}
public static void main(String[] args) {
User user = get(User::new);
}
}- 實(shí)例方法 聲明函數(shù)接口
@FunctionalInterface
public interface HelloLambda {
public void print(String text);
}通過(guò) 對(duì)象::方法 引用
public class Test {
public static void print(HelloLambda helloLambda) {
helloLambda.print("HELLO");
}
public static void main(String[] args) {
LowerPrint test = new LowerPrint();
print(test::toLowerCase);
}
}
class LowerPrint {
public void toLowerCase(String text) {
System.out.println(text.toLowerCase());
}
}Lambda使用前提
Lambda表達(dá)式的語(yǔ)法是非常簡(jiǎn)潔的,通過(guò)以上的示例可以發(fā)現(xiàn),在使用Lambda表達(dá)式時(shí)需要滿(mǎn)足以下條件:
- 方法的參數(shù)和局部變量類(lèi)型必須為接口才能使用Lambda。
- 必須有一個(gè)函數(shù)式接口:有且只有一個(gè)抽象方法的接口
@FunctionalInterface注解。
常見(jiàn)的函數(shù)式接口:
Runnable/Callable
Supplier/Consumer
Comparator
Predicate
Function
Lambda本質(zhì)
Lambda本質(zhì)其實(shí)就是為了解決匿名內(nèi)部類(lèi)使用時(shí)繁瑣的代碼。 舉個(gè)例子:當(dāng)我們啟動(dòng)一個(gè)線程執(zhí)行任務(wù)時(shí),需要執(zhí)行以下操作
- Thread類(lèi)需要一個(gè)Runnable接口作為參數(shù),其中run方法執(zhí)行核心內(nèi)容。
- 為了指定run方法體,不得不需要一個(gè)Runnable的實(shí)現(xiàn)類(lèi)。
- 為了省去定義一個(gè)Runnable的實(shí)現(xiàn)類(lèi),不得不使用匿名內(nèi)部類(lèi)。
- 使用匿名內(nèi)部類(lèi)時(shí)必須覆蓋run方法體。
- 但是實(shí)際上我們只需要編寫(xiě)run方法體的內(nèi)容,所以當(dāng)我們使用Lambda表達(dá)式啟動(dòng)一個(gè)線程執(zhí)行任務(wù)時(shí),不用定義Runnable的實(shí)現(xiàn)類(lèi)也可以不使用匿名內(nèi)部類(lèi)。如下示例:
new Thread(() -> System.out.println("執(zhí)行業(yè)務(wù)")).start();Lambda和匿名內(nèi)部類(lèi)對(duì)比
- 所需類(lèi)型不一樣:匿名內(nèi)部類(lèi)的類(lèi)型可以是類(lèi)、抽象類(lèi)、接口;Lambda表達(dá)式所需要的類(lèi)型必須是接口。
- 抽象方法的數(shù)量不一樣:匿名內(nèi)部類(lèi)中的抽象方法數(shù)量是隨意的;Lambda表達(dá)式所需要的接口中只能有一個(gè)抽象方法。
- 實(shí)現(xiàn)原理不一樣:匿名內(nèi)部類(lèi)是編譯后形成一個(gè)class;Lambda表達(dá)式是在程序運(yùn)行時(shí)動(dòng)態(tài)生成class。
Stream流介紹
Stream流的目的是增強(qiáng)容器的操作:List、Set、Queue等。其特點(diǎn)為:
- 專(zhuān)注于對(duì)容器對(duì)象的聚合操作
- 提供串行/并行兩種模式
- 提高編程效率、可讀性
Stream流使用分為3個(gè)步驟:獲取流->中間操作->終結(jié)操作。
獲取流
Stream<String> stringStream = Stream.of(new String[]{"a", "b"});
Stream<String> stream = new ArrayList<String>().stream();中間操作:打開(kāi)流->操作流->返回新流->交給下一個(gè)流使用。具體的操作有:map、filter、sorted、limit、skip、concat、paraller。
Stream<String> stringStream = Stream.of(new String[]{"a", "b"});
stringStream.filter(s -> s.equalsIgnoreCase("a"));終結(jié)操作:只能有一個(gè),最后的操作。具體的操作有:forEach、collect、min、max、count
Stream<String> stringStream = Stream.of(new String[]{"a", "b"});
stringStream.forEach(System.out::println);到此這篇關(guān)于Java的Lambda表達(dá)式和Stream流簡(jiǎn)單示例的文章就介紹到這了,更多相關(guān)Lambda表達(dá)式和Stream流示例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream
- Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對(duì)象數(shù)據(jù)合并
- Java中的lambda和stream實(shí)現(xiàn)排序
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- 吊打Java面試官之Lambda表達(dá)式 Stream API
- Java8中Lambda表達(dá)式使用和Stream API詳解
- 詳解Java遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的兩種方式
- Java實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的示例代碼
- Java樹(shù)形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件方法記錄
- Java使用 Stream 流和 Lambda 組裝復(fù)雜父子樹(shù)形結(jié)構(gòu)
相關(guān)文章
SpringBoot配置數(shù)據(jù)庫(kù)密碼加密的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot配置數(shù)據(jù)庫(kù)密碼加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java通過(guò)接口實(shí)現(xiàn)匿名類(lèi)的實(shí)例代碼
這篇文章介紹了Java通過(guò)接口實(shí)現(xiàn)匿名類(lèi)的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
SpringBoot項(xiàng)目運(yùn)行一段時(shí)間后自動(dòng)關(guān)閉的坑及解決
這篇文章主要介紹了SpringBoot項(xiàng)目運(yùn)行一段時(shí)間后自動(dòng)關(guān)閉的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
@TableName注解和@Table的區(qū)別及說(shuō)明
這篇文章主要介紹了@TableName注解和@Table的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java通過(guò)cellstyle屬性設(shè)置Excel單元格常用樣式的全面總結(jié)講解
在處理Excel文件時(shí),經(jīng)常需要對(duì)單元格進(jìn)行樣式設(shè)置,以滿(mǎn)足特定的需求和美化要求,這篇文章主要給大家介紹了關(guān)于Java通過(guò)cellstyle屬性設(shè)置Excel單元格常用樣式的相關(guān)資料,需要的朋友可以參考下2024-01-01
詳解Java8中接口的默認(rèn)方法和靜態(tài)方法
Java 8是Java語(yǔ)言的一個(gè)重要版本,其中引入了許多新特性和改進(jìn),其中一個(gè)值得關(guān)注的特性是接口的默認(rèn)方法和靜態(tài)方法,本文就來(lái)和大家簡(jiǎn)單講講吧2023-05-05
簡(jiǎn)單了解JavaCAS的相關(guān)知識(shí)原理
這篇文章主要介紹了簡(jiǎn)單了解JavaCAS的相關(guān)知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
簡(jiǎn)述Java編程語(yǔ)言對(duì)象的容納
這篇文章主要對(duì)Java編程思想中對(duì)象的容納進(jìn)行了一個(gè)總體的介紹,具有一定的參考價(jià)值,需要的朋友可以了解下。2017-09-09

