当前位置: 首页 > 知识库问答 >
问题:

在Java8中,带有2个箭头的lambda是什么意思?

沈德寿
2023-03-14

我以前读过几本Java8教程。

现在我遇到了以下主题:java支持咖喱吗?

在这里,我看到以下代码:

IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;
System.out.println(curriedAdd.apply(1).applyAsInt(12));

我知道这个例子总结了两个元素,但我无法理解其结构:

a -> b -> a + b;

根据表达式的左边部分,此行应实现以下功能:

R apply(int value); 

在此之前,我只遇到过只有一支箭的Lambdas。

共有3个答案

颜新
2023-03-14

添加括号可能会使这一点更加清楚:

IntFunction<IntUnaryOperator> curriedAdd = a -> (b -> (a + b));

或者中间变量可能会有所帮助:

IntFunction<IntUnaryOperator> curriedAdd = a -> {
    IntUnaryOperator op = b -> a + b;
    return op;
};
颜文康
2023-03-14

一个代码

因此,一个<代码>的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;
            }
        };
    }
};
谈桐
2023-03-14

如果将其表示为非简写lambda语法或前lambda Java匿名类语法,则会更清楚发生了什么。。。

原来的问题。为什么有两支箭?简单来说,有两个函数正在定义。。。第一个函数是定义函数的函数,第二个函数是该函数的结果,它恰好也是函数。每个都需要一个-

IntFunction<IntUnaryOperator> curriedAdd = (a) -> {
    return (b) -> {
        return a + b;
    };
};
IntFunction<IntUnaryOperator> curriedAdd = new IntFunction<IntUnaryOperator>() {
    @Override
    public IntUnaryOperator apply(final int value) {
        IntUnaryOperator op = new IntUnaryOperator() {
            @Override
            public int applyAsInt(int operand) {
                return operand + value;
            }
        };
        return op;
    }
};

 类似资料: