JAVA 8函數語言程式設計(一):高階函式
阿新 • • 發佈:2019-02-02
函數語言程式設計的核心在高階函式與偏函式,在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是一門非常優秀的面嚮物件語言,在函數語言程式設計方面,跟其他函式語言相比,還是顯得非常笨重與生澀,並且其內在體現出來的思想,依舊式面向物件,更重要的式,對函數語言程式設計支援的特性較少,例如實現柯里化就非常困難。