Java中Lambda表達(dá)式和函數(shù)式接口的使用和特性
1.概述
當(dāng)Java 8發(fā)布時,其中最令人興奮的特性之一就是 Lambda 表達(dá)式。Lambda 表達(dá)式是一種輕量級、簡潔和高效的函數(shù)式編程方法。它可以用來代替 Java 舊有的匿名內(nèi)部類,提高代碼的可讀性和可維護(hù)性。
2.lambda表達(dá)式的基礎(chǔ)
Lambda 表達(dá)式是一個匿名函數(shù),由輸入?yún)?shù)和處理邏輯兩部分組成:
(parameter1, parameter2, ...) -> { code block }
輸入或者輸出可以為空:
() -> System.out.println("Hello, world!")
(a) -> {}
() -> {}
多參數(shù)用括號,單參數(shù)可以不用括號:
(a,b) -> a+b
a -> System.out.print(a)
多條處理邏輯用花括號,單條處理邏輯可以不用花括號:
(a,b) -> a+b;
(a,b) -> {a+b;a-b;}
3.JAVA中的lambda表達(dá)式
要在 Java 中使用 Lambda 表達(dá)式,需要將它們賦值給一個函數(shù)式接口變量。函數(shù)式接口是只包含一個抽象方法的接口,它們提供了一種定義 Lambda 表達(dá)式類型的方式。例如,下面的函數(shù)式接口 MyInterface
包含了一個抽象方法 doSomething
:
interface MyInterface { void doSomething(); }
要使用 Lambda 表達(dá)式實(shí)現(xiàn)這個接口,只需要提供一個與 doSomething
方法簽名匹配的 Lambda 表達(dá)式即可。例如,下面的代碼使用 Lambda 表達(dá)式創(chuàng)建了一個 MyInterface
對象,并調(diào)用了它的 doSomething
方法:
MyInterface myLambda = () -> System.out.println("Hello, world!"); myLambda.doSomething();
在這個例子中,我們使用 Lambda 表達(dá)式創(chuàng)建了一個 MyInterface
對象,并將它賦值給了 myLambda
變量。然后,我們調(diào)用了 myLambda.doSomething()
方法,輸出了 Hello, world!
。
4.函數(shù)式接口
內(nèi)置函數(shù)式接口
概述
JDK8內(nèi)置實(shí)現(xiàn)了一些常用的函數(shù)式接口:
接口 | 作用 |
Function | 程序中映射邏輯的抽象 |
Predicate | 程序中判斷邏輯的抽象 |
Consumer | 程序中的消費(fèi)型邏輯的抽象 |
Suppiler | 程序中的生產(chǎn)邏輯的抽象 |
Function
Function接口,可以定義入?yún)⒑统鰠⒌念愋?,可用于類型轉(zhuǎn)換。
代碼示例:
Function<String,Integer> function=(String i)-> Integer.parseInt(i); System.out.println(function.apply("1")==1);
Predicate
Predicate接口,指定返回值為布爾類型,可用于斷言。
public static void main(String[] args) { Predicate<String> predicate = (s) -> s.length() > 0; // 測試字符串的長度是否>0 System.out.println(predicate.test("hello")); // 結(jié)果取反 System.out.println(predicate.negate().test("hello")); System.out.println("=====or / and======"); System.out.println(predicate.test("")); // 增加或判斷,二者滿足其一則為true System.out.println(predicate.or(s -> s.equals("")).test("")); // 增加與判斷,二者都滿足則為true System.out.println(predicate.and(s -> s.equals("hello")).test("")); System.out.println(predicate.and(s -> s.equals("hello")).test("hello")); System.out.println("=====isEqual======"); // 判斷是否相等 System.out.println(Predicate.isEqual("hello").test("")); System.out.println(Predicate.isEqual("hello").test("hello")); Predicate<Boolean> nonNull = Objects::nonNull; Predicate<Boolean> isNull = Objects::isNull; Predicate<String> isEmpty = String::isEmpty; Predicate<String> isNotEmpty = isEmpty.negate(); }
Consumer
Consumer接口,又叫消費(fèi)接口,沒有返回值,就像把輸入消費(fèi)掉了一樣。
public static void main(String[] args) { Consumer<Object> consumer1 = new Consumer<Object>() { @Override public void accept(Object o) { System.out.println("這次消費(fèi)了:" + o.toString()); } }; consumer1.accept("100w元在雙十一!這下窮死了!"); Consumer<String> consumer2 = s -> System.out.println("這次消費(fèi)了:" + s); consumer2.accept("120w元在雙十二!又窮死了!"); }
Suppiler
Suppiler接口,又叫生產(chǎn)接口,可以自定義返回值,用來生產(chǎn)一些東西。
public static void main(String[] args) { // 生成一個字符串 Supplier<String> supplier1 = () -> "abcde"; // 生成一個隨機(jī)數(shù) Supplier<Integer> supplier2 = () -> new Random().nextInt(10); // 產(chǎn)生一個運(yùn)行時異常 Supplier<RuntimeException> supplier3 = () -> new RuntimeException(); System.out.println(supplier1.get()); System.out.println(supplier2.get().intValue()); System.out.println(supplier3.get()); }
5.級聯(lián)與柯里化
級聯(lián)表達(dá)式,含有多個箭頭的lambda表達(dá)式,即“套娃”lambda表達(dá)式。
以下列l(wèi)ambda表達(dá)式為例:
x->y->x+y
假設(shè)輸入的為Integer類型,
用Function接口來表達(dá)即為:
輸入一個Integer x,返回一個Integer y,
Integer y又可以用Function接口來表示為:
輸入一個Integer,返回一個Integer
Function<Integer,Function<Integer,Integer>> functionFunction= x->y->x+y; System.out.println(functionFunction.apply(2).apply(3));
到此這篇關(guān)于Java中Lambda表達(dá)式和函數(shù)式接口的使用和特性的文章就介紹到這了,更多相關(guān)Java lambda表達(dá)式與函數(shù)式接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java?redis中緩存穿透?緩存擊穿?雪崩三種現(xiàn)象以及解決方法
緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時的用戶很可能是攻擊者,攻擊會導(dǎo)致數(shù)據(jù)庫壓力過大2022-01-01基于Springboot+Junit+Mockito做單元測試的示例
本篇文章主要介紹了基于Springboot+Junit+Mockito做單元測試的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02java迭代器基礎(chǔ)知識點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于java迭代器基礎(chǔ)知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01Java中ExecutorService和ThreadPoolExecutor運(yùn)行原理
本文主要介紹了Java中ExecutorService和ThreadPoolExecutor運(yùn)行原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08SpringBoot/Spring?AOP默認(rèn)動態(tài)代理方式實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot/Spring?AOP默認(rèn)動態(tài)代理方式的相關(guān)資料,Spring AOP是一款基于Java的AOP框架,其中默認(rèn)采用動態(tài)代理方式實(shí)現(xiàn)AOP功能,本文將詳細(xì)介紹動態(tài)代理的實(shí)現(xiàn)原理和使用方法,需要的朋友可以參考下2023-03-03Spring JDK動態(tài)代理實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Spring JDK動態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解
今天小編就為大家分享一篇關(guān)于Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?
這篇文章主要介紹了Springboot?引入?Redis?并配置序列化并封裝RedisTemplate。文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09