java - Java 8 - 匿名类和 lambda 函数之间的明显不一致
问题描述
在使用 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
所以要么这两个声明不等价,这很难承认,或者,如果它们是等价的,考虑到它们在相同的上下文中被调用,具有相同的参数,它们应该产生相同的结果。不是矛盾吗?
非常感谢任何可以在这里遮光的人。
亲切的问候,尼古拉斯
解决方案
声明不等价。由于可变阴影,第一种方法可以转换为:
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
.
推荐阅读
- javascript - 为 Snipcart 产品验证定义 JSON 文件
- google-chrome - 是否可以从我已删除然后替换的 chrome 扩展中检索数据?
- python - 如何将凭证模板提交到 github
- html - 自动完成角
- r - R:获取两个时间戳之间的天百分比
- css - 引导列布局,两列,一列固定宽度,另一列宽度,被响应式广告打破
- excel - (VBA)如果单元格 X 小于则删除整行,如果单元格 Y 小于则删除整行
- node.js - 如何将 OpenID 连接到 Nest JS 应用程序
- angular - 浏览到页面后发送 HTTP 请求作为 Web Crawling 的单独请求(Angular 站点)
- python - 如何将图像添加到我的 discord.py Bot 的游戏活动中?