Function Currying in Java

Function Currying in Java

概念

在Java中定义了一个参数方法(Function)、两个参数方法(BiFunction),可以将这两种方法以参数形式传递到其他方法中,但是针对太多参数的方法,就需要使用额外的库(Vavr),另一种选择就是使用Function Currying。

Function Currying表示将多参数的方法切割为单参数的多个方法,输出结果是相同的。
切换成单参数的方法除了最后一个方法返回期望的值之外,其他方法都是返回一个方法。


通过如下代码对比 (used Currying vs unused Currying)

unused Currying

withoutCurryingFunction(a, b, c) {
    return (a + b + c);
}

used Currying

curryingFunction(a) {
    return addNumberTwo(b) {
        return addNumberThree(c) {
            return (a + b + c);
        }
    }
}

通过如下公式对比 (used Currying vs unused Currying)

unused Currying

f: (u, v) -> w

used Currying

g: (u -> (v -> w))

上面的方法g是u参数返回一个方法,返回的方法是从v参数返回w值
上面的两个方法是相等的。

g(u)(v) = f(u, v)

因此 curry(f) = g

简单例子

添加方法

public class GFG {
    public static void main(String args[])
    {
        // Curried Function for Adding u & v
        Function<Integer,
                 Function<Integer, Integer> >
            curryAdder = u -> v -> u + v;

        // Calling Curried Function for Adding u & v
        System.out.println("Add 2, 3 :"
                           + curryAdder
                                 .apply(2)
                                 .apply(3));

        }
}

输出如下:

Add 2, 3 :5

乘以方法

public class GFG {
    public static void main(String args[])
    {
        // Curried Function for Multiplying u & v
        Function<Integer,
                 Function<Integer, Integer> >
            curryMulti = u -> v -> u * v;

        // Calling Curried Function for Multiplying u & v
        System.out.println("Multiply 2, 3 :"
                           + curryMulti
                                 .apply(2)
                                 .apply(3));
    }
}

输出如下:

Multiply 2, 3 :6

三个数值相加

public class GFG {
    public static void main(String args[])
    {
        // Curried Function for Adding u, v & w
        Function<Integer,
                 Function<Integer,
                          Function<Integer, Integer> > >
            triadder = u -> w -> v -> u + w + v;

        // Calling Curried Function for Adding u, v & w
        System.out.println("Add 2, 3, 4 :"
                           + triadder
                                 .apply(2)
                                 .apply(3)
                                 .apply(4));
    }
}

输出如下:

Add 2, 3, 4 :9

复杂例子

例子1

class Letter {
    private String salutation;
    private String body;
    
    Letter(String salutation, String body){
        this.salutation = salutation;
        this.body = body;
    }
}

创建对象的方法1

Letter createLetter(String salutation, String body){
    return new Letter(salutation, body);
}

创建对象的方法2

BiFunction<String, String, Letter> SIMPLE_LETTER_CREATOR 
  = (salutation, body) -> new Letter(salutation, body);

创建对象的方法3

Function<String, Function<String, Letter>> SIMPLE_CURRIED_LETTER_CREATOR 
  = salutation -> body -> new Letter(salutation, body);

方法3就是Function Currying(从多个参数方法修改为单个参数的多个方法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值