柚子快報(bào)激活碼778899分享:詳解Java之lambda
柚子快報(bào)激活碼778899分享:詳解Java之lambda
目錄
lambda
引入
語(yǔ)法
函數(shù)式接口
lambda表達(dá)式的使用
語(yǔ)法精簡(jiǎn):
代碼示例:
變量捕獲
局部變量捕獲
成員變量捕獲
lambda在集合中的使用
lambda的優(yōu)缺點(diǎn)
lambda
引入
Lambda表達(dá)式是Java SE 8中一個(gè)重要的新特性。lambda表達(dá)式允許你通過(guò)表達(dá)式來(lái)代替功能接口。 lambda表達(dá)式就和方法一樣,它提供了一個(gè)正常的參數(shù)列表和一個(gè)使用這些參數(shù)的主體(body,可以是一個(gè)表達(dá)式或一個(gè)代碼塊)。Lambda 表達(dá)式可以看作是一個(gè)匿名函數(shù)。
語(yǔ)法
基本語(yǔ)法: (parameters) -> expression或(parameters) ->{ statements; }
Lambda表達(dá)式由三部分組成:
1. paramaters:類似方法中的形參列表,這里的參數(shù)是函數(shù)式接口里的參數(shù)。這里的參數(shù)類型可以明確的聲明也可不聲明而由JVM隱含的推斷。另外當(dāng)只有一個(gè)推斷類型時(shí)可以省略掉圓括號(hào)。 2. ->:可理解為“被用于”的意思; 3. 方法體:可以是表達(dá)式也可以代碼塊,是函數(shù)式接口里方法的實(shí)現(xiàn)。代碼塊可返回一個(gè)值或者什么都不返回,這里的代碼塊等同于方法的方法體。如果是表達(dá)式,也可以返回一個(gè)值或者什么都不返回。
函數(shù)式接口
要了解Lambda表達(dá)式,首先需要了解什么是函數(shù)式接口。
函數(shù)式接口定義:一個(gè)接口有且只有一個(gè)抽象方法。?
注意:
1.
如果一個(gè)接口只有一個(gè)抽象方法,那么該接口就是一個(gè)函數(shù)式接口。
2. 如果我們?cè)谀硞€(gè)接口上聲明了@FunctionalInterface注解,那么編譯器就會(huì)按照函數(shù)式接口的定義來(lái)要求該接口,這樣如果有兩個(gè)抽象方法,程序編譯就會(huì)報(bào)錯(cuò)的。所以,從某種意義上來(lái)說(shuō),只要你保證你的接口中只有一個(gè)抽象方法,你可以不加這個(gè)注解。加上就會(huì)自動(dòng)進(jìn)行檢測(cè)的。
代碼示例1:
@FunctionalInterface
interface NoParameterNoReturn {
void test();
}
代碼示例2:
@FunctionalInterface
interface NoParameterNoReturn {
void test();
default void test2(){
System.out.println("JDK1.8新特性,default默認(rèn)方法可以有具體的實(shí)現(xiàn)");
}
}
lambda表達(dá)式的使用
Lambda
表達(dá)式本質(zhì)是一個(gè)匿名函數(shù),函數(shù)的方法是:返回值方法名參數(shù)列表方法體。在,
Lambda
表達(dá)式中我們只需要關(guān)心:參數(shù)列表方法體。
語(yǔ)法精簡(jiǎn):
1. 參數(shù)類型可以省略,如果需要省略,每個(gè)參數(shù)的類型都要省略。 2. 參數(shù)的小括號(hào)里面只有一個(gè)參數(shù),那么小括號(hào)可以省略 3. 如果方法體當(dāng)中只有一句代碼,那么大括號(hào)可以省略 4. 如果方法體中只有一條語(yǔ)句,要么是輸出語(yǔ)句,其次是return語(yǔ)句,那么大括號(hào)可以省略,且去掉return關(guān)鍵字。?
代碼示例:
//無(wú)返回值無(wú)參數(shù)
@FunctionalInterface
interface NoParameterNoReturn {
void test();
}
//無(wú)返回值一個(gè)參數(shù)
@FunctionalInterface
interface OneParameterNoReturn {
void test(int a);
}
//無(wú)返回值多個(gè)參數(shù)
@FunctionalInterface
interface MoreParameterNoReturn {
void test(int a,int b);
}
//有返回值無(wú)參數(shù)
@FunctionalInterface
interface NoParameterReturn {
int test();
}
//有返回值一個(gè)參數(shù)
@FunctionalInterface
interface OneParameterReturn {
int test(int a);
}
//有返回值多參數(shù)
@FunctionalInterface
interface MoreParameterReturn {
int test(int a,int b);
}
public class Test {
public static void main(String[] args) {
/*NoParameterNoReturn noParameterNoReturn = ()->System.out.println("test.....");
noParameterNoReturn.test();*/
/*OneParameterNoReturn oneParameterNoReturn = (x) -> {
System.out.println(x);
};*/
/*OneParameterNoReturn oneParameterNoReturn = x -> System.out.println(x);
oneParameterNoReturn.test(10);*/
/*MoreParameterNoReturn moreParameterNoReturn = (int x,int y) -> {
System.out.println(x+y);
};*/
/*OneParameterReturn oneParameterReturn = a -> a;
System.out.println(oneParameterReturn.test(10));*/
/*
NoParameterReturn noParameterReturn = ()->{return 10;};
*/
/* NoParameterReturn noParameterReturn = ()-> 10;
System.out.println(noParameterReturn.test());*/
MoreParameterNoReturn moreParameterNoReturn = (x,y) -> System.out.println(x+y);
moreParameterNoReturn.test(10,20);
}
}
變量捕獲
在Java中,Lambda表達(dá)式允許以更簡(jiǎn)潔的方式實(shí)現(xiàn)接口中的方法。Lambda表達(dá)式可以捕獲其所在上下文中有效的final或effectively final(實(shí)際上final,即在Lambda表達(dá)式內(nèi)部沒有被修改)的局部變量和成員變量。這種捕獲機(jī)制使得Lambda表達(dá)式能夠訪問(wèn)和使用這些變量,而無(wú)需顯式地將它們作為參數(shù)傳遞給Lambda表達(dá)式。
局部變量捕獲
對(duì)于局部變量,Lambda表達(dá)式只能捕獲那些被聲明為final或者實(shí)際上未被修改的變量(effectively final)。這意味著即使變量沒有被顯式地聲明為final,但如果你在Lambda表達(dá)式之外沒有修改這個(gè)變量的值,那么這個(gè)變量也可以被Lambda表達(dá)式捕獲。
public class LambdaDemo {
public static void main(String[] args) {
final int number = 10; // 顯式聲明為final
int anotherNumber = 20; // 實(shí)際上final,因?yàn)橹鬀]有被修改
// 使用Lambda表達(dá)式
Runnable r = () -> System.out.println(number); // 可以捕獲number
// Runnable r = () -> System.out.println(anotherNumber); // 也可以捕獲anotherNumber
// 如果嘗試修改anotherNumber,則上面的Lambda表達(dá)式將無(wú)法編譯
// anotherNumber = 30;
r.run();
}
}
成員變量捕獲
與局部變量不同,Lambda表達(dá)式可以直接訪問(wèn)所在類的成員變量,無(wú)論這些成員變量是否被聲明為final。這是因?yàn)槌蓡T變量是類的屬性,它們的生命周期與類的實(shí)例相同,而Lambda表達(dá)式只是類的實(shí)例的一個(gè)方法或者構(gòu)造器中的一部分。?
public class LambdaDemo {
private int classVariable = 42;
public void display() {
Runnable r = () -> System.out.println(classVariable); // 直接訪問(wèn)成員變量
r.run();
}
public static void main(String[] args) {
new LambdaDemo().display();
}
}
總結(jié)
1.Lambda表達(dá)式內(nèi)部不能修改捕獲的局部變量(除非這些變量是數(shù)組或集合的元素,并且2.Lambda表達(dá)式通過(guò)引用訪問(wèn)這些元素)。 3.Lambda表達(dá)式可以捕獲并訪問(wèn)類的成員變量和靜態(tài)變量,無(wú)需任何限制。 4.Java 8及以上版本支持Lambda表達(dá)式。
lambda在集合中的使用
為了能夠讓
Lambda
和
Java
的集合類集更好的一起使用,集合當(dāng)中,也新增了部分接口,以便與
Lambda
表達(dá)式對(duì)接。
對(duì)應(yīng)的接口新增的方法CollectionremoveIf(),spliterator(),stream(),parallelStream(),forEach()ListreplaceAll(),sort()MapgetOrDefault(),forEach(),replaceAll(),putIfAbsent(),remove(),replace(),merge()
代碼示例:
public class Test2 {
public static void main(String[] args) {
Map
map.put("hello",13);
map.put("abc",3);
map.put("zhangsan",31);
/*map.forEach(new BiConsumer
@Override
public void accept(String s, Integer integer) {
System.out.println("key: "+s +" val: "+integer);
}
});*/
map.forEach((s, integer) -> System.out.println("key: "+s +" val: "+integer));
}
public static void main1(String[] args) {
List
list.add("hello");
list.add("abc");
list.add("zhangsan");
/*list.forEach(new Consumer
@Override
public void accept(String s) {
System.out.println(s);
}
});*/
list.forEach(s -> System.out.println(s));
/* list.sort(new Comparator
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});*/
list.sort((o1, o2) -> o1.compareTo(o2));
System.out.println("====");
list.forEach(s -> System.out.println(s));
}
}
lambda的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1.代碼簡(jiǎn)潔性:Lambda表達(dá)式可以使得代碼更加簡(jiǎn)潔易讀,尤其是當(dāng)實(shí)現(xiàn)簡(jiǎn)單的接口時(shí)。相比傳統(tǒng)的匿名內(nèi)部類,Lambda表達(dá)式在語(yǔ)法上更加簡(jiǎn)潔。 2.增強(qiáng)功能性接口的使用:Lambda表達(dá)式常與功能性接口(Functional Interface,即只包含一個(gè)抽象方法的接口)一起使用,使得這些接口的實(shí)現(xiàn)變得更加容易和直觀。 3.易于并行計(jì)算:Java 8的Streams API與Lambda表達(dá)式相結(jié)合,使得數(shù)據(jù)集的并行處理變得簡(jiǎn)單而高效。開發(fā)者可以輕松地將順序操作轉(zhuǎn)換為并行操作,從而提高程序的執(zhí)行效率。 4.促進(jìn)函數(shù)式編程風(fēng)格:Lambda表達(dá)式和Streams API等特性促進(jìn)了Java中函數(shù)式編程風(fēng)格的應(yīng)用,使得Java不再僅僅是面向?qū)ο蟮木幊陶Z(yǔ)言,也可以用于實(shí)現(xiàn)更加靈活的函數(shù)式編程范式。 5.提升API的設(shè)計(jì):Lambda表達(dá)式使得API的設(shè)計(jì)更加靈活和強(qiáng)大。開發(fā)者可以設(shè)計(jì)出更加通用和靈活的接口,以適應(yīng)不同的使用場(chǎng)景。
缺點(diǎn):
1.學(xué)習(xí)曲線:對(duì)于習(xí)慣于傳統(tǒng)Java編程范式的開發(fā)者來(lái)說(shuō),Lambda表達(dá)式和Streams API等新特性可能需要一定的時(shí)間來(lái)學(xué)習(xí)和適應(yīng)。 2.調(diào)試難度:由于Lambda表達(dá)式在語(yǔ)法上的簡(jiǎn)潔性,有時(shí)候可能會(huì)使得調(diào)試變得更加困難。尤其是在復(fù)雜的Lambda表達(dá)式中,追蹤錯(cuò)誤來(lái)源可能會(huì)比較棘手。 3.性能開銷:雖然Lambda表達(dá)式在大多數(shù)情況下不會(huì)對(duì)性能產(chǎn)生顯著影響,但在某些極端情況下(如大量使用Lambda表達(dá)式和Streams API進(jìn)行密集計(jì)算),可能會(huì)引入一定的性能開銷。這是因?yàn)長(zhǎng)ambda表達(dá)式和Streams API的底層實(shí)現(xiàn)可能需要更多的內(nèi)存和CPU資源。 4.可讀性和可維護(hù)性:雖然Lambda表達(dá)式可以使代碼更加簡(jiǎn)潔,但在某些情況下,過(guò)度使用或?yàn)E用Lambda表達(dá)式可能會(huì)降低代碼的可讀性和可維護(hù)性。例如,過(guò)于復(fù)雜的Lambda表達(dá)式可能會(huì)使得其他開發(fā)者難以理解其邏輯。 5.限制了變量的使用:Lambda表達(dá)式內(nèi)部只能訪問(wèn)標(biāo)記為final或effectively final的局部變量。這一限制可能會(huì)在某些情況下造成不便,尤其是當(dāng)需要在Lambda表達(dá)式內(nèi)部修改外部變量時(shí)。?
柚子快報(bào)激活碼778899分享:詳解Java之lambda
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。