在调查 Java 8 函数式编程时,我发现了以下明显的不一致之处。下面的两个结构应该是等价的:
public static BiFunction<Integer, Integer, Integer> addTwoIntegers (Integer i1, Integer i2)
{
return new BiFunction<Integer, Integer, Integer>()
{
@Override
public Integer apply(Integer i1, Integer i2)
{
return i1 +i2;
}
};
}
public static BiFunction<Integer, Integer, Integer> addTwoIntegers2 (Integer i1, Integer i2)
{
return (i1x, i2x) -> i1 + i2;
}
第一个声明是一个传统的匿名类,而第二个声明是一个 lambda 函数,但除此之外它们应该是等价的。现在,按如下方式调用它们:
System.out.println("addTwoIntegers: " + addTwoIntegers(new Integer(0), new Integer(0)).apply(new Integer(5), new Integer(7)));
System.out.println("addTwoIntegers2: " + addTwoIntegers2(new Integer(0), new Integer(0)).apply(new Integer(5), new Integer(7)));
我得到:
addTwoIntegers: 12
addTwoIntegers2: 0
因此,要么这两个声明不等价,这很难承认,要么,如果它们等价,假设它们在相同的上下文中被调用,使用相同的参数,它们应该产生相同的结果。这不是矛盾吗?
非常感谢能在这里遮光的人。
亲切的问候,尼古拉斯
最佳答案
声明不等价。由于 variable shadowing第一个方法可以翻译为:
public static BiFunction<Integer, Integer, Integer> addTwoIntegers(Integer i1, Integer i2) {
return (i1x, i2x) -> i1x + i2x;
}
第二个方法函数表达式是指addTwoIntegers2
方法参数i1
和i2
,而不是函数参数i1x
和 i2x
。 i1
是 i2
在函数闭包中可用,因为它们都是 0
结果是 0
。
关于Java 8 - 匿名类和 lambda 函数之间明显的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871728/