Java Lambda表示式的3種簡寫方式

2020-07-16 10:05:16
使用 Lambda 表示式是為了簡化程式程式碼,Lambda 表示式本身也提供了多種簡化形式,這些簡化形式雖然簡化了程式碼,但客觀上使得程式碼可讀性變差。本節介紹 Lambda 表示式的幾種簡化形式。

省略引數型別

Lambda 表示式可以根據上下文環境推斷出引數型別。calculate 方法中 Lambda 表示式能推斷出引數 a 和 b 是 int 型別,簡化形式如下:
public static Calculable calculate(char opr) {
    Calculable result;
    if (opr == '+') {
        // Lambda表示式實現Calculable介面
        result = (a, b) -> {
            return a + b;
        };
    } else {
        // Lambda表示式實現Calculable介面
        result = (a, b) -> {
            return a - b;
        };
    }
    return result;
}
程式碼第 5 行和第 10 行是《Java Lambda表示式》一節範例中result = (int a, int b) -> {程式碼的簡化寫法,其中 a 和 b 是引數。

省略引數小括號

如果 Lambda 表示式中的引數只有一個,可以省略引數小括號。修改 Calculable 介面中的 calculateInt 方法,程式碼如下。
// 可計算介面
@FunctionalInterface
public interface Calculable {
    // 計算一個int數值
    int calculateInt(int a);
}
其中 calculateInt 方法只有一個 int 型別引數,返回值也是 int 型別。呼叫 calculateInt 方法程式碼如下:
public static void main(String[] args) {
    int n1 = 10;

    // 實現二次方計算Calculable物件
    Calculable f1 = calculate(2);
    // 實現三次方計算Calculable物件
    Calculable f2 = calculate(3);
    // 呼叫calculateInt方法進行加法計算
    System.out.printf("%d二次方 = %d n", n1, f1.calculateInt(n1));
    // 呼叫calculateInt方法進行減法計算
    System.out.printf("%d三次方 = %d n", n1, f2.calculateInt(n1));
}

/**
* 通過冪計算
*
* @param power 冪
* @return 實現Calculable介面物件
*/
public static Calculable calculate(int power) {
    Calculable result;
    if (power == 2) {
        // Lambda表示式實現Calculable介面
        // 標準形式
        result = (int a) -> {
            return a * a;
        };
    } else {
        // Lambda表示式實現Calculable介面
        // 省略形式
        result = a -> {
            return a * a * a;
        };
    }
    return result;
}
上述程式碼第 25 行和第 31 行都是實現 Calculable 介面的 Lambda 表示式。程式碼第 25 行是標準形式沒有任何的簡化。程式碼第 31 行省略了引數型別和小括號。

輸出結果為:

10二次方 = 100
10三次方 = 1000 

省略return和大括號

如果 Lambda 表示式體中只有一條語句,那麼可以省略 return 和大括號,程式碼如下:
public static Calculable calculate(int power) {
    Calculable result;
    if (power == 2) {
        // Lambda表示式實現Calculable介面
        // 標準形式
        result = (int a) -> {
            return a * a;
        };
    } else {
        // Lambda表示式實現Calculable介面
        // 省略形式
        result = a -> a * a * a;
    }
    return result;
}
上述程式碼第 12 行是省略了 return 和大括號,這是最簡化形式的 Lambda 表示式了,程式碼太簡潔了,但是對於初學者而言很難理解這個表示式。