在Java8中,带2个箭头的lambda是什么意思?
我以前读过一些Java8教程 现在我遇到了以下话题: 在这里,我看到以下代码:在Java8中,带2个箭头的lambda是什么意思?,java,lambda,java-8,currying,Java,Lambda,Java 8,Currying,我以前读过一些Java8教程 现在我遇到了以下话题: 在这里,我看到以下代码: IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b; System.out.println(curriedAdd.apply(1).applyAsInt(12)); 根据表达式的左侧,此行应实现以下功能: R apply(int value); 在此之前,我只遇到了一个箭头lambdas。如果您将其表示为非简写lambd
IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;
System.out.println(curriedAdd.apply(1).applyAsInt(12));
根据表达式的左侧,此行应实现以下功能:
R apply(int value);
在此之前,我只遇到了一个箭头lambdas。如果您将其表示为非简写lambda语法或前lambda Java匿名类语法,则更清楚发生了什么 原来的问题。为什么有两支箭?很简单,有两个函数正在定义。。。第一个函数是定义函数的函数,第二个函数是该函数的结果,它恰好也是函数。每个都需要一个
->
操作符来定义它
非速记
IntFunction curriedAdd=(a)->{
返回(b)->{
返回a+b;
};
};
Java 8之前的Lambda
IntFunction curriedAdd=新的IntFunction(){
@凌驾
公共IntUnaryOperator应用(最终整数值){
IntUnaryOperator op=新的IntUnaryOperator(){
@凌驾
公共整数applyAsInt(整数操作数){
返回操作数+值;
}
};
返回op;
}
};
一个int函数
是一个int->R
函数。IntUnaryOperator
是一种功能int->int
a -> b -> a + b;
^ | |
| ---------
| ^
| |
| The IntUnaryOperator (that takes an int, b) and return an int (the sum of a and b)
|
The parameter you give to the IntFunction
因此,int函数
是以int
为参数并返回以int
为参数并返回int
的函数
a -> b -> a + b;
^ | |
| ---------
| ^
| |
| The IntUnaryOperator (that takes an int, b) and return an int (the sum of a and b)
|
The parameter you give to the IntFunction
如果您使用匿名类来“分解”lambda,可能会更清楚:
IntFunction<IntUnaryOperator> add = new IntFunction<IntUnaryOperator>() {
@Override
public IntUnaryOperator apply(int a) {
return new IntUnaryOperator() {
@Override
public int applyAsInt(int b) {
return a + b;
}
};
}
};
IntFunction add=new IntFunction(){
@凌驾
公共肠套叠手术器应用(INTA){
返回新的IntUnaryOperator(){
@凌驾
公共int applyAsInt(int b){
返回a+b;
}
};
}
};
让我们用括号重写lambda表达式,使其更清楚:
IntFunction<IntUnaryOperator> curriedAdd = a -> (b -> (a + b));
IntFunction<IntUnaryOperator> curriedAdd = a -> (b -> (a + b));
IntFunction curriedAdd=a->(b->(a+b));
因此,我们声明了一个函数,它接受一个int
,返回一个函数
。更具体地说,返回的函数接受一个int
并返回一个int
(两个元素的总和):这可以表示为一个
因此,curriedAdd
是一个函数,它接受一个int
并返回一个IntUnaryOperator
,因此它可以表示为。添加括号可以更清楚地说明这一点:
IntFunction<IntUnaryOperator> curriedAdd = a -> (b -> (a + b));
IntFunction<IntUnaryOperator> curriedAdd = a -> (b -> (a + b));
IntFunction curriedAdd=a->(b->(a+b));
或者,中间变量可能会有所帮助:
IntFunction<IntUnaryOperator> curriedAdd = a -> {
IntUnaryOperator op = b -> a + b;
return op;
};
IntFunction curriedAdd=a->{
气管插管术者op=b->a+b;
返回op;
};
如果您仔细看,它可能会变得更清晰:IntFunction
是一个功能接口。它表示接受int
并返回R
类型值的函数
在这种情况下,返回类型R
也是功能接口
,即IntUnaryOperator
。因此,第一个(外部)函数本身返回一个函数
在这种情况下:当应用于int
时,curriedAdd
应返回一个函数,该函数再次接受int
(并再次返回int
,因为IntUnaryOperator
就是这样做的)
在函数式编程中,通常将函数类型写为param->return\u value
,您可以在这里看到这一点。所以curriedAdd
的类型是int->int->int
(或者int->(int->int)
,如果您更喜欢的话)
Java8的lambda语法与此一致。要定义这样一个函数,您需要编写
a -> b -> a + b
这与实际的lambda演算非常相似:
λa λb a + b
λb a+b
是一个函数,它接受单个参数b
并返回一个值(总和)λaλb a+b
是一个函数,它接受单个参数a
,并返回单个参数的另一个函数λaλb a+b
返回λb a+b
并将a
设置为参数值。这是两个lambda表达式
IntFunction<IntUnaryOperator> curriedAdd =
a -> { //this is for the fixed value
return b -> { //this is for the add operation
return a + b;
};
}
IntUnaryOperator addTwo = curriedAdd.apply(2);
System.out.println(addTwo.applyAsInt(12)); //prints 14
IntFunction curriedAdd=
a->{//这是固定值
返回b->{//这是用于添加操作的
返回a+b;
};
}
IntUnaryOperator addTwo=当前数据应用(2);
System.out.println(addTwo.applyAsInt(12))//印刷品14
你明白咖喱的意思吗?这对于这个问题来说是非常重要的。它只是一个lambda,返回一个lambda。预lambda需要一个final int值
是的,你是对的,但我仍然使用Java 8编译器,允许你使用“有效的final”@gstackoverflow是的,但是Java8不是pre-lambda
,您也可以在Java8中使用pre-lambda样式。我写的JFYLAMBDAS不是为了让人们得分吗?:-)