1. 程式人生 > >JAVA 8函數語言程式設計(一):高階函式

JAVA 8函數語言程式設計(一):高階函式

函數語言程式設計的核心在高階函式與偏函式,在JAVA 8中,提供了很多函式式的介面,但跟Python、Javascript的函式相比較,還是存在較大的距離。

首先看一個高階函式的例子,這裡利用區域性變數域特性,進行延遲求值,如下:


/**
 * 輸入一定數量的引數,然後統一求值
 * @param size 需要求值的個數
 * @param fn 求值函式
 * @return 函式物件
 * 從函式的定義就可以看出,Java函式程式設計的內在思想還是面向物件
 */
public IntFunction<Integer> addNum(int size, ToIntFunction<List<Integer>> fn) {
    //  宣告區域性變數,用於儲存傳入引數
final List<Integer> args = Lists.newArrayList(); return new IntFunction<Integer>() { @Override public Integer apply(int value) { // 沒有達到定義的數量之前,不求值 int result = -1; if(args.size() == size) { result = fn.applyAsInt(args); } else
{ args.add(value); } // 返回結果 return result; } }; }

單元測試程式碼如下:

//  準備測試物件
IntFunction<Integer> addFun = this.addNum(3, items -> {
    //  利用reduce進行求值
    return items.stream().reduce(0, (x, y) -> x + y);
});
//  方法呼叫還很生硬,有個莫名其妙的函式名apply,可能會引起業務的誤解
addFun.apply(1); addFun.apply(2); addFun.apply(3); // 超過了數量不求值 int result = addFun.apply(4); // 1+2+3 = 6 assertThat(result, IsEqual.equalTo(6));

結論

JAVA是一門非常優秀的面嚮物件語言,在函數語言程式設計方面,跟其他函式語言相比,還是顯得非常笨重與生澀,並且其內在體現出來的思想,依舊式面向物件,更重要的式,對函數語言程式設計支援的特性較少,例如實現柯里化就非常困難。