java8,Lambda 表達式以及 函數式接口的使用

前言:最近看技術博文,關於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章