華爲721----Java8新特性_

拖着生病的身體,終於面試結束,趁着沒有遺忘,先整理下

自己使用Eclipse一邊寫,一邊感受下好了,面試時候,主要強調的是Lambda表達式,先來看看。

1. Lambda表達式

package temp;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Java8 {

	public static void main(String[] args) {
		List<String> name = Arrays.asList("xiekai","xiaowang","xiaoxia");
		
		Collections.sort(name, new Comparator<String>() {
			public int compare(String a, String b) {
				return b.compareTo(a);
			}
		});
		
	}

}

在Collections.sort裏面傳入一個比較器來指定排序,創建一個匿名對象,傳入sort裏面。

但是java8裏面,使用Lambda表達式,更簡潔的。

		//Lambda表達式
		Collections.sort(name, (String a, String b)->{
			return a.compareTo(b);
		});
		System.out.println(name);
		Collections.sort(name, (String a, String b)->a.compareTo(b));
		System.out.println(name);
		Collections.sort(name, (a,b)->a.compareTo(b));
		System.out.println(name);

呀呀呀,好簡潔。。。。

特別是最後一個,Java編譯器可以自動推導出參數類型,所以你可以不用再寫一次類型。

繼續看Lambda表達式。

2. 函數式接口

        Lambda表達式是如何在java的類型系統中表示的呢?每一個lambda表達式都對應一個類型,通常是接口類型。而“函數式接口”是指僅僅只包含一個抽象方法的接口,每一個該類型的lambda表達式都會被匹配到這個抽象方法。因爲 默認方法 不算抽象方法,所以你也可以給你的函數式接口添加默認方法。


        我們可以將lambda表達式當作任意只包含一個抽象方法的接口類型,確保你的接口一定達到這個要求,你只需要給你的接口添加 @FunctionalInterface 註解,編譯器如果發現你標註了這個註解的接口有多於一個抽象方法的時候會報錯的。


@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);    // 123

需要注意如果@FunctionalInterface如果沒有指定,上面的代碼也是對的。


譯者注 將lambda表達式映射到一個單方法的接口上,這種做法在Java 8之前就有別的語言實現,比如Rhino JavaScript解釋器,如果一個函數參數接收一個單方法的接口而你傳遞的是一個function,Rhino 解釋器會自動做一個單接口的實例到function的適配器,典型的應用場景有 org.w3c.dom.events.EventTarget 的addEventListener 第二個參數 EventListener。

上述轉自 http://www.jb51.net/article/48304.htm

3. 方法與構造函數的引用








發佈了183 篇原創文章 · 獲贊 43 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章