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(从多个参数方法修改为单个参数的多个方法)