欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java8中l(wèi)ambda表達式的用法

這篇文章主要講解了“Java8中l(wèi)ambda表達式的用法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java8中l(wèi)ambda表達式的用法”吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了池州免費建站歡迎大家使用!

函數(shù)式接口

只含有一個抽象方法的接口,被稱為函數(shù)式接口,例如Runnable、Comparator、EventHandler,可以使用lambda表達式來創(chuàng)建函數(shù)式接口的實例對象,例如:

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ù)式接口,通常會使用 @FunctionalInterface對接口類型進行注解。

Java lambda的作用

  • lambda表達式廣義上的定義是:一個帶有參數(shù)的表達式。

  • 在Java中,lambda表達式唯一的作用就是函數(shù)式接口的轉(zhuǎn)換,我們寫的lambda表達式,都是為了代替對函數(shù)式接口的實現(xiàn),簡化編碼工作。

  • lambda表達式的參數(shù)列表對應(yīng)函數(shù)式接口的抽象方法的參數(shù)列表,lambda表達式內(nèi)容對應(yīng)抽象方法實現(xiàn)的方法體。

Java lambda語法

語法

 (Type1 parameter1, Type2 parameter2, ..., TypeN parameterN) -> {  
	 statement1;   
	 statement2;   
	 ...  
	statementN;  
	return value;  
};

示例:

(String first, String second) -> Integer.compare(first.length(), second.length());

簡化與變形

  • 如果lambda表達式?jīng)]有參數(shù),只寫一對小括號(),括號內(nèi)留空;

  • 如果一個lambda表達式的參數(shù)類型是可以被推導(dǎo)的,那么可以省略參數(shù)類型;例如:
    Comparator<String> comp = (first, second) -> Integer.compare(first.length(), second.length());

  • 如果一個lambda表達式只有一個參數(shù),且該參數(shù)的類型是可以被推導(dǎo)的,那么可以省略參數(shù)類型和小括號,例如:
    EventHandler<ActionEvent> handler = event -> System.out.println("Thanks for clicking!");

補充

  • lambda表達式的參數(shù)列表本身也是要映射函數(shù)式接口抽象方法的參數(shù)列表的,所以我們可以像對待方法參數(shù)一樣對待lambda表達式參數(shù),例如:添加final修飾、添加@NonNull注解等;

  • 為了更容易地理解lambda,最好將lambda表達式想象成一個函數(shù),而不是一個對象,并記住該函數(shù)可以被等價轉(zhuǎn)換成為一個函數(shù)式接口;

方法引用

背景

想要傳遞給其他代碼的操作已經(jīng)有現(xiàn)成的實現(xiàn)方法了,想要復(fù)用已有的實現(xiàn),例如:
button.setOnAction(event -> System.out.println(event));可以簡化為:
button.setOnAction(System.out::println);
其中的System.out::println就是一個方法引用,需要注意的是,方法引用等同于一個lambda表達式,也是需要可以被轉(zhuǎn)換為一個對應(yīng)的函數(shù)式接口。再舉一個例子,不區(qū)分大小寫對字符串進行排序:
Arrays.sort(strings, String::compareToIgnoreCase);

3種方法引用方式

  • 類名::靜態(tài)方法名,對靜態(tài)方法的引用;

  • 類名::成員方法名,對第一個參數(shù)指定對象的成員方法的引用;

  • 對象::成員方法名,對指定對象成員方法的引用;

示例分別如下:
示例1:(double x, double n) -> Math::pow;
示例2:Arrays.sort(strings, String::compareToIgnoreCase);
示例3:button.setOnAction(System.out::println);

其他常用方式示例:
this::實例方法;
super::實例方法。

構(gòu)造器引用

格式: 類名::new,示例:
Button::new, int[]::new(等價于x -> new int[x])
如果有多個構(gòu)造器,編譯器會從中推斷并挑選一個最合適的構(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();

一個lambda表達式有3個部分:

  • 一段代碼;

  • 參數(shù);

  • 自由變量的值,即不是參數(shù)又沒有在代碼中定義的變量的值,例如上例中的:text、count;

  • 因為lambda表達式可能會再repeatMessage方法返回后執(zhí)行,所以需要在方法被調(diào)用時就捕獲自由變量的值并保存起來,以便在表達式執(zhí)行時使用變量值;

  • 含有自由變量的代碼塊被稱為“閉包”,所以lambda表達式就是Java的閉包,內(nèi)部類也是閉包;

  • 在lambda表達式中,引用的外部變量值是不可以在表達式中被修改的,因為修改的話線程不安全,但是,此不可變的約束只做用在變量引用上,無法限制變量內(nèi)部的值的修改,例如:數(shù)組元素、集合元素、或者其他實例變量的屬性等;

  • lambda表達式中使用this,引用的是創(chuàng)建該lambda表達式的方法所在對象,而非lambda表達式對應(yīng)函數(shù)式接口實現(xiàn)類的this;

  • lambda表達式中不允許出現(xiàn)與局部變量同名的變量定義;

接口默認方法

背景

為了使存量接口能夠支持lambda表達式,同時又不影響已有的實現(xiàn)類,Java8開始支持接口的默認方法實現(xiàn),這樣存量接口就可以通過添加默認方法的方式來支持lambda表達式。

默認方法沖突解決規(guī)則

  • 選擇父類中的方法。如果一個父類中提供了具體的實現(xiàn)方法,那么接口中的默認同簽名方法會被忽略;

  • 接口沖突。如果一個類的一個父接口提供了一個默認方法,另一個接口中有相同簽名的方法(不管是否默認方法),實現(xiàn)類必須覆蓋該方法來解決沖突。

感謝各位的閱讀,以上就是“Java8中l(wèi)ambda表達式的用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java8中l(wèi)ambda表達式的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

網(wǎng)站名稱:Java8中l(wèi)ambda表達式的用法
網(wǎng)站網(wǎng)址:http://chinadenli.net/article8/ghocop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、虛擬主機、移動網(wǎng)站建設(shè)、建站公司、網(wǎng)站設(shè)計公司微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
国产在线成人免费高清观看av| 五月综合婷婷在线伊人| 九九热在线视频精品免费| 人人妻人人澡人人夜夜| 亚洲国产av一二三区| 在线日本不卡一区二区| 大香蕉久草网一区二区三区 | 欧美精品专区一区二区| 亚洲成人精品免费在线观看| 欧美日韩精品久久亚洲区熟妇人| 日本人妻精品有码字幕| 精品精品国产自在久久高清| 午夜精品在线观看视频午夜| 中国少妇精品偷拍视频| 91麻豆视频国产一区二区| 不卡中文字幕在线免费看| 亚洲第一区二区三区女厕偷拍| 欧美精品一区二区水蜜桃| 日韩精品一区二区三区射精| 激情五月激情婷婷丁香| 国产又粗又猛又大爽又黄同志| 少妇人妻精品一区二区三区 | 免费在线观看欧美喷水黄片| 亚洲精品福利视频你懂的| 亚洲中文在线中文字幕91| 色综合视频一区二区观看| 熟女少妇久久一区二区三区| 欧美一级不卡视频在线观看| 婷婷基地五月激情五月| 久久热这里只有精品视频| 少妇高潮呻吟浪语91| 欧美午夜色视频国产精品| 亚洲精品蜜桃在线观看| 日韩精品小视频在线观看| 成人三级视频在线观看不卡| 国产福利在线播放麻豆| 久久精品国产亚洲av麻豆尤物| 加勒比日本欧美在线观看| 国产麻豆精品福利在线| 日韩一级免费中文字幕视频| 亚洲乱码av中文一区二区三区|