欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:詳解Java之lambda

柚子快報(bào)激活碼778899分享:詳解Java之lambda

http://yzkb.51969.com/

目錄

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 = new HashMap<>();

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 = new ArrayList<>();

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

http://yzkb.51969.com/

相關(guān)鏈接

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19562915.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄