天天看點

一、java函數式程式設計概念

什麼是函數式程式設計, 每個人的了解不盡相同。函數式程式設計中的函數并非指計算機中的函數,而是指數學中的函數,即自變量的映射。 其核心思想是: 使用不可變值或函數對一個值進行處理, 映射成另一個值。

在Java中,提到函數式程式設計,最先想到的是Lambda表達式了,切忌把Lambda表達式和函數式程式設計劃等号,Lambda表達式隻是符合函數式程式設計風格的一種匿名函數表現形式。Lambda表達式在Java8中終于被引入了,這讓很多以前代碼中的匿名寫法得以簡化。

public static void main(String[] args) {
        // 匿名内部類寫法
        new Thread(new Runnable() {
            public void run() {
                System.out.println("匿名函數");
            }
        }).start();

        // Lambda表達式寫法
        new Thread(() -> System.out.println("函數式程式設計")).start();
    }           

設計匿名内部類的目的, 就是為了友善 Java 程式員将代碼作為資料傳遞。 不過, 匿名内部類還是不夠簡便。 為了調用一行重要的邏輯代碼, 不得不加上幾行冗繁的樣闆代碼。改成Lambda 表達式使代碼更加簡潔、易讀。

Lambda表達式幾種常用寫法

1、 Lambda 表達式不包含參數, 使用空括号 () 表示沒有參數。 該 Lambda 表達式實作了 Runnable 接口, 該接口也隻有一個 run 方法, 沒有參數, 且傳回類型為 void,如下:

// 寫法1
Runnable noArguments = () -> System.out.println("Hello World");
new Thread(noArguments).start();

// 寫法2
new Thread(() -> System.out.println("Hello World")).start();           

2、 Lambda 表達式包含且隻包含一個參數, 可省略參數的括号,如下:

List<String> list = Arrays.asList("nodejs", "java", "python", "ruby");
// 寫法1
Consumer<String> oneArgument = str -> System.out.println(str);
list.forEach(oneArgument);

// 寫法2
list.forEach(str -> System.out.println(str));           

3、 Lambda 表達式的主體不僅可以是一個表達式, 而且也可以是一段代碼塊, 使用大括号{} 将代碼塊括起來,代碼塊和普通方法遵循的規則别無二緻, 可以用傳回或抛出異常來退出。 隻有一行代碼的 Lambda 表達式也可使用大括号, 用以明确 Lambda表達式從何處開始、 到哪裡結束,如下:

new Thread(() -> {
    System.out.println("Hello World");
    System.out.println("Hello World");
}).start();           

4、 Lambda 表達式包含多個參數的方法,使用小括号将參數括起來,如下:

// 直接調用寫法
BinaryOperator<Integer> add = (x, y) -> x + y;
int result = add.apply(2, 3);

// 作為參數調用寫法
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = math(Arrays.asList(numbers), 0, (x, y) -> x + y);

public static <T> T math(List<T> list, T init, BinaryOperator<T> operator) {
    T result = init;
    for (T t : list) {
        result = operator.apply(result, t);
    }
    return result;
}           

5、 Lambda 表達式中的參數類型可以由編譯器推斷得出的,但也可以顯式聲明參數類型, 此時就需要使用小括号将參數括起來, 參數類型寫在參數前面,如下:

BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;