前言:最近看技術博文,關於if..else過多的情況,在以前的解決方案一般是用策略模式,但是這篇博文給了個新的思路,利用Java 8 Lambda 表達式加上Map與函數式接口來實現優美的解決思路。那麼問題來了,什麼是Lambda 表達式?什麼是函數式接口?
一、什麼是Lambda 表達式?
先來看幾個例子:
// 1. 不需要參數,返回值爲 5
() -> 5
// 2. 接收一個參數(數字類型),返回其2倍的值
x -> 2 * x
// 3. 接受2個參數(數字),並返回他們的差值
(x, y) -> x – y
// 4. 接收2個int型整數,返回他們的和
(int x, int y) -> x + y
// 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)
(String s) -> System.out.print(s)
我們可以發現,可以把表達式分爲三個部分,即->、->左邊和->右邊。不難看出,->左邊爲方法接受的參數,->右邊爲方法的具體實現。以x -> 2 * x 爲例,這個方法用以前的寫法來表示的話,
private X method(X x){
return 2*x
}
通過以上的例子,我們可以看見Lambda 表達式的以下重要特性:
- 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
好,Lambda 表達式我們是會看了,那麼具體是怎麼使用呢?
答案是java提供了給我們很多的基礎函數式接口,例如以下案例:
public static void main(String[] args) {
IntBinaryOperator intBinaryOperator = (x,y) -> x - y;
System.out.println(intBinaryOperator.applyAsInt(2, 1)); // 1
Function<String, String> function = (x) -> String.format("hello %s !", x);
System.out.println(function.apply("world")); // hello world!
}
Lambda 表達式構成的函數會返回一個函數式接口,而Lambda 表達式構成的函數就是這個接口的實現了。我們可以查看以下函數式接口的內容:
@FunctionalInterface
public interface IntBinaryOperator {
/**
* Applies this operator to the given operands.
*
* @param left the first operand
* @param right the second operand
* @return the operator result
*/
int applyAsInt(int left, int right);
}
二、什麼是函數式接口?
1、只包含一個抽象方法的接口,稱爲函數式接口。
2、你可以通過 Lambda 表達式來創建該接口的對象。(若 Lambda表達式拋出一個受檢異常,那麼該異常需要在目標接口的抽象方法上進行聲明)。
3、我們可以在任意函數式接口上使用 @FunctionalInterface 註解,這樣做可以檢查它是否是一個函數式接口,同時 javadoc 也會包含一條聲明,說明這個接口是一個函數式接口。
4、在java.util.function包下定義了java 8 的豐富的函數式接口
因此,我們自定義函數接口的話,只要加上 @FunctionalInterface 註解,然後滿足函數式接口的規範即可,他既可以是接口,也可以是抽象類。
@FunctionalInterface
public interface MyFunctionalInterface {
String method(String str);
public static void main(String[] args) {
MyFunctionalInterface function = (x) -> String.format("hello %s !", x);
System.out.println(function.method("world")); // hello world!
}
}
本文參考博文:
Java8 新特性 之 函數式接口——https://blog.csdn.net/qinchao_mei/article/details/97649152
Java 8 Lambda 表達式 | 菜鳥教程——https://www.runoob.com/java/java8-lambda-expressions.html