Java中Lambda表達式和函數(shù)式接口的使用和特性
1.概述
當(dāng)Java 8發(fā)布時,其中最令人興奮的特性之一就是 Lambda 表達式。Lambda 表達式是一種輕量級、簡潔和高效的函數(shù)式編程方法。它可以用來代替 Java 舊有的匿名內(nèi)部類,提高代碼的可讀性和可維護性。
2.lambda表達式的基礎(chǔ)
Lambda 表達式是一個匿名函數(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表達式
要在 Java 中使用 Lambda 表達式,需要將它們賦值給一個函數(shù)式接口變量。函數(shù)式接口是只包含一個抽象方法的接口,它們提供了一種定義 Lambda 表達式類型的方式。例如,下面的函數(shù)式接口 MyInterface 包含了一個抽象方法 doSomething:
interface MyInterface {
void doSomething();
}要使用 Lambda 表達式實現(xiàn)這個接口,只需要提供一個與 doSomething 方法簽名匹配的 Lambda 表達式即可。例如,下面的代碼使用 Lambda 表達式創(chuàng)建了一個 MyInterface 對象,并調(diào)用了它的 doSomething 方法:
MyInterface myLambda = () -> System.out.println("Hello, world!");
myLambda.doSomething();在這個例子中,我們使用 Lambda 表達式創(chuàng)建了一個 MyInterface 對象,并將它賦值給了 myLambda 變量。然后,我們調(diào)用了 myLambda.doSomething() 方法,輸出了 Hello, world!。
4.函數(shù)式接口
內(nèi)置函數(shù)式接口
概述
JDK8內(nèi)置實現(xiàn)了一些常用的函數(shù)式接口:
| 接口 | 作用 |
| Function | 程序中映射邏輯的抽象 |
| Predicate | 程序中判斷邏輯的抽象 |
| Consumer | 程序中的消費型邏輯的抽象 |
| 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接口,又叫消費接口,沒有返回值,就像把輸入消費掉了一樣。
public static void main(String[] args) {
Consumer<Object> consumer1 = new Consumer<Object>() {
@Override
public void accept(Object o) {
System.out.println("這次消費了:" + o.toString());
}
};
consumer1.accept("100w元在雙十一!這下窮死了!");
Consumer<String> consumer2 = s -> System.out.println("這次消費了:" + s);
consumer2.accept("120w元在雙十二!又窮死了!");
}Suppiler
Suppiler接口,又叫生產(chǎn)接口,可以自定義返回值,用來生產(chǎn)一些東西。
public static void main(String[] args) {
// 生成一個字符串
Supplier<String> supplier1 = () -> "abcde";
// 生成一個隨機數(shù)
Supplier<Integer> supplier2 = () -> new Random().nextInt(10);
// 產(chǎ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)表達式,含有多個箭頭的lambda表達式,即“套娃”lambda表達式。
以下列l(wèi)ambda表達式為例:
x->y->x+y
假設(shè)輸入的為Integer類型,
用Function接口來表達即為:
輸入一個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表達式和函數(shù)式接口的使用和特性的文章就介紹到這了,更多相關(guān)Java lambda表達式與函數(shù)式接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Java list.remove( )方法需要注意的兩個坑
這篇文章主要介紹了淺談Java list.remove( )方法需要注意的兩個坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
spring源碼閱讀--@Transactional實現(xiàn)原理講解
這篇文章主要介紹了spring源碼閱讀--@Transactional實現(xiàn)原理講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
淺談System.getenv()和System.getProperty()的區(qū)別
這篇文章主要介紹了System.getenv()和System.getProperty()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
java線程安全鎖ReentrantReadWriteLock原理分析readLock
這篇文章主要為大家介紹了java線程安全鎖ReentrantReadWriteLock原理分析readLock,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

