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

2022-08-31 08:53:52

我之前读过几个Java 8教程。

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

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

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

我知道这个例子和2个元素加起来,但我无法理解结构:

a -> b -> a + b;

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

R apply(int value); 

在此之前,我只遇到一个箭头的lambdas。


答案 1

如果您将其表示为非速记 lambda 语法或 lambda Java 之前的匿名类语法,则更清楚发生了什么...

最初的问题。为什么是两个箭头?很简单,有两个函数正在定义...第一个函数是函数定义函数,第二个是该函数的结果,它也恰好是函数。每个都需要一个操作员来定义它。->

非速记

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

在 Java 8 之前的 Lambda 之前

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;
    }
};

答案 2

An 是一个函数 。An 是一个函数 。IntFunction<R>int -> RIntUnaryOperatorint -> int

因此,an 是一个函数,它采用 as 参数并返回一个函数,该函数采用 as 参数并返回 .IntFunction<IntUnaryOperator>intintint

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;
            }
        };
    }
};