Java8新特性系列(Lambda)

史培培發表於2018-02-08

題圖:by pixel2013 From pixabay

上期我們分析了Java8中Interface的相關新特性,其中包括函式式介面,可以在呼叫時,使用一個Lambda表示式作為引數,那麼我們就來談談Java8中的Lambda表示式吧。

定義

Lambda表示式基於函式式介面實現,故可以認為Lambda表示式是對函式式介面的匿名內部類的一種簡寫形式。

格式

Lambda表示式的具體形式為:()->{}

箭頭表示式->將Lambda表示式分為了左右兩部分,左側為引數列表,右側為具體實現,即Lambda體。

具體有以下以及情形:

1. 無引數無返回值

Runnable runnable = () -> {
	System.out.println("run");
};
複製程式碼

2. 有一個引數無返回值

public interface MyInterface {
	void test(int x);
}

MyInterface i = (x) -> System.out.println(x);
複製程式碼

3. 只要一個引數,小括號可以不寫

MyInterface i = x -> System.out.println(x);
複製程式碼

4. 有多個引數有返回值,並且Lambda體有多條語句

Comparator<Integer> comparator = (x, y) -> {
    System.out.println("Comparator");
    return Integer.compare(x, y);
};
複製程式碼

5. Lambda體中只有一條語句,return和{}可以省略

Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
複製程式碼

6. Lambda 表示式的引數列表的資料型別可以省略不寫,因為JVM編譯器通過上下文推斷出,資料型別,即“型別推斷”

Comparator<Integer> comparator = (Integer x, Intergery) -> Integer.compare(x, y);
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
複製程式碼

總結:

  • 引數型別可忽略,若寫所有引數都要寫,若不寫,可以型別推斷
  • 引數有且僅有一個時,()可以省略
  • Lambda體只有一條語句,return{}都可忽略

Java8內建四大核心函式式介面(java.util.function.*包)

  • Consumer 消費型介面
public static void main(String[] args) {
	String str = "str";
	consumer(str, s -> System.out.println(s));
}

public static void consumer(String str, Consumer<String> function) {
	function.accept(str);
}
複製程式碼
  • Supplier 供給型介面
public static void main(String[] args) {
	supplier(() -> "str");
}

public static String supplier(Supplier<String> function) {
	return function.get();
}
複製程式碼
  • Function<T, R> 函式型介面
public static void main(String[] args) {
	String str = "str";
	function(str, s -> s);
}
	
public static String function(String str, Function<String, String> function) {
	return function.apply(str);
}
複製程式碼
  • Predicate 斷定型介面
public static void main(String[] args) {
	String str = "str";
	predicate(str, s -> s.isEmpty());
}

public static boolean predicate(String str, Predicate<String> function) {
	return function.test(str);
}
複製程式碼

Lambda表示式就到這裡了,一開始用起來會不習慣,用多了上手起來就熟練了,而且越用越信手拈來。

下期我們將分析用引用方式簡寫Lambda表示式,敬請期待。

Java8新特性系列(Lambda)

微信公眾號:碼上論劍
請關注我的個人技術微信公眾號,訂閱更多內容

相關文章