這篇文章主要講解了“Java8中l(wèi)ambda表達(dá)式的用法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java8中l(wèi)ambda表達(dá)式的用法”吧!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了池州免費(fèi)建站歡迎大家使用!
只含有一個(gè)抽象方法的接口,被稱為函數(shù)式接口,例如Runnable、Comparator、EventHandler,可以使用lambda表達(dá)式來創(chuàng)建函數(shù)式接口的實(shí)例對(duì)象,例如:
Runnable task = () -> System.out.println("Hello Lambda!"); Comparator<String> comp = (first, second) -> Integer.compare(first.length(), second.length()); EventHandler<ActionEvent> handler = event -> System.out.println("Thanks for clicking!");
Java中的函數(shù)式接口,通常會(huì)使用 @FunctionalInterface對(duì)接口類型進(jìn)行注解。
lambda表達(dá)式廣義上的定義是:一個(gè)帶有參數(shù)的表達(dá)式。
在Java中,lambda表達(dá)式唯一的作用就是函數(shù)式接口的轉(zhuǎn)換,我們寫的lambda表達(dá)式,都是為了代替對(duì)函數(shù)式接口的實(shí)現(xiàn),簡(jiǎn)化編碼工作。
lambda表達(dá)式的參數(shù)列表對(duì)應(yīng)函數(shù)式接口的抽象方法的參數(shù)列表,lambda表達(dá)式內(nèi)容對(duì)應(yīng)抽象方法實(shí)現(xiàn)的方法體。
(Type1 parameter1, Type2 parameter2, ..., TypeN parameterN) -> { statement1; statement2; ... statementN; return value; };
(String first, String second) -> Integer.compare(first.length(), second.length());
如果lambda表達(dá)式?jīng)]有參數(shù),只寫一對(duì)小括號(hào)(),括號(hào)內(nèi)留空;
如果一個(gè)lambda表達(dá)式的參數(shù)類型是可以被推導(dǎo)的,那么可以省略參數(shù)類型;例如:
Comparator<String> comp = (first, second) -> Integer.compare(first.length(), second.length());
如果一個(gè)lambda表達(dá)式只有一個(gè)參數(shù),且該參數(shù)的類型是可以被推導(dǎo)的,那么可以省略參數(shù)類型和小括號(hào),例如:
EventHandler<ActionEvent> handler = event -> System.out.println("Thanks for clicking!");
lambda表達(dá)式的參數(shù)列表本身也是要映射函數(shù)式接口抽象方法的參數(shù)列表的,所以我們可以像對(duì)待方法參數(shù)一樣對(duì)待lambda表達(dá)式參數(shù),例如:添加final修飾、添加@NonNull注解等;
為了更容易地理解lambda,最好將lambda表達(dá)式想象成一個(gè)函數(shù),而不是一個(gè)對(duì)象,并記住該函數(shù)可以被等價(jià)轉(zhuǎn)換成為一個(gè)函數(shù)式接口;
想要傳遞給其他代碼的操作已經(jīng)有現(xiàn)成的實(shí)現(xiàn)方法了,想要復(fù)用已有的實(shí)現(xiàn),例如:
button.setOnAction(event -> System.out.println(event));
可以簡(jiǎn)化為:button.setOnAction(System.out::println);
其中的System.out::println就是一個(gè)方法引用,需要注意的是,方法引用等同于一個(gè)lambda表達(dá)式,也是需要可以被轉(zhuǎn)換為一個(gè)對(duì)應(yīng)的函數(shù)式接口。再舉一個(gè)例子,不區(qū)分大小寫對(duì)字符串進(jìn)行排序:Arrays.sort(strings, String::compareToIgnoreCase);
類名::靜態(tài)方法名,對(duì)靜態(tài)方法的引用;
類名::成員方法名,對(duì)第一個(gè)參數(shù)指定對(duì)象的成員方法的引用;
對(duì)象::成員方法名,對(duì)指定對(duì)象成員方法的引用;
示例分別如下:
示例1:(double x, double n) -> Math::pow;
示例2:Arrays.sort(strings, String::compareToIgnoreCase);
示例3:button.setOnAction(System.out::println);
其他常用方式示例:
this::實(shí)例方法;
super::實(shí)例方法。
格式: 類名::new,示例:
Button::new, int[]::new(等價(jià)于x -> new int[x])
如果有多個(gè)構(gòu)造器,編譯器會(huì)從中推斷并挑選一個(gè)最合適的構(gòu)造器。
構(gòu)造器引用可用于突破Java無法構(gòu)建泛型數(shù)組的限制:
List<String> lables = ...; Stream<Button> stream = lables.stream().map(Button::new); Button[] buttons = stream.toArray(Button[]::new);
public static void repeatMessage(String text, int count) { Runnable r = () -> { for (int i=0; i < count; i++) { System.out.println(text); Thread.yield(); } } } new Thread(r).start();
一個(gè)lambda表達(dá)式有3個(gè)部分:
一段代碼;
參數(shù);
自由變量的值,即不是參數(shù)又沒有在代碼中定義的變量的值,例如上例中的:text、count;
因?yàn)閘ambda表達(dá)式可能會(huì)再repeatMessage方法返回后執(zhí)行,所以需要在方法被調(diào)用時(shí)就捕獲自由變量的值并保存起來,以便在表達(dá)式執(zhí)行時(shí)使用變量值;
含有自由變量的代碼塊被稱為“閉包”,所以lambda表達(dá)式就是Java的閉包,內(nèi)部類也是閉包;
在lambda表達(dá)式中,引用的外部變量值是不可以在表達(dá)式中被修改的,因?yàn)樾薷牡脑捑€程不安全,但是,此不可變的約束只做用在變量引用上,無法限制變量?jī)?nèi)部的值的修改,例如:數(shù)組元素、集合元素、或者其他實(shí)例變量的屬性等;
lambda表達(dá)式中使用this,引用的是創(chuàng)建該lambda表達(dá)式的方法所在對(duì)象,而非lambda表達(dá)式對(duì)應(yīng)函數(shù)式接口實(shí)現(xiàn)類的this;
lambda表達(dá)式中不允許出現(xiàn)與局部變量同名的變量定義;
為了使存量接口能夠支持lambda表達(dá)式,同時(shí)又不影響已有的實(shí)現(xiàn)類,Java8開始支持接口的默認(rèn)方法實(shí)現(xiàn),這樣存量接口就可以通過添加默認(rèn)方法的方式來支持lambda表達(dá)式。
選擇父類中的方法。如果一個(gè)父類中提供了具體的實(shí)現(xiàn)方法,那么接口中的默認(rèn)同簽名方法會(huì)被忽略;
接口沖突。如果一個(gè)類的一個(gè)父接口提供了一個(gè)默認(rèn)方法,另一個(gè)接口中有相同簽名的方法(不管是否默認(rèn)方法),實(shí)現(xiàn)類必須覆蓋該方法來解決沖突。
感謝各位的閱讀,以上就是“Java8中l(wèi)ambda表達(dá)式的用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java8中l(wèi)ambda表達(dá)式的用法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
網(wǎng)站名稱:Java8中l(wèi)ambda表達(dá)式的用法
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article8/ghocop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、建站公司、網(wǎng)站設(shè)計(jì)公司、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)