JAVA 8函数式编程(一):高阶函数

函数式编程的核心在高阶函数与偏函数,在JAVA 8中,提供了很多函数式的接口,但跟Python、Javascript的函数相比较,还是存在较大的距离。

首先看一个高阶函数的例子,这里利用局部变量域特性,进行延迟求值,如下:


/**
 * 输入一定数量的参数,然后统一求值
 * @param size 需要求值的个数
 * @param fn 求值函数
 * @return 函数对象
 * 从函数的定义就可以看出,Java函数编程的内在思想还是面向对象
 */
public IntFunction addNum(int size, ToIntFunction> fn) {
    //  声明局部变量,用于存储传入参数
    final List args = Lists.newArrayList();
    return new IntFunction() {

        @Override
        public Integer apply(int value) {
            //  没有达到定义的数量之前,不求值
            int result = -1;
            if(args.size() == size) {
                result = fn.applyAsInt(args);
            } else {
                args.add(value);
            }
            //  返回结果
            return result;
        }

    };

}

单元测试代码如下:

//  准备测试对象
IntFunction 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是一门非常优秀的面向对象语言,在函数式编程方面,跟其他函数语言相比,还是显得非常笨重与生涩,并且其内在体现出来的思想,依旧式面向对象,更重要的式,对函数式编程支持的特性较少,例如实现柯里化就非常困难。

你可能感兴趣的:(java)