Java 8 - 匿名类和 lambda 函数之间明显的不一致

标签 java lambda java-8 anonymous-class functional-interface

在调查 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方法参数i1i2,而不是函数参数i1xi2xi1i2 在函数闭包中可用,因为它们都是 0 结果是 0

关于Java 8 - 匿名类和 lambda 函数之间明显的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871728/

相关文章:

java - JTextArea 中的撤消功能

python - lambda 中的 bool 值求值

java - lambda 不需要异常处理

c# - Html 通过 lambda 扩展模型的两个属性

java - 数组无法解析?这是构建路径问题吗?

java - 从构造函数调用虚方法

java - 无法模拟方法

java - 使用 iText 将 HTML 转换为 PDF,格式问题

java - 生成无限的元组流

java - 事件顺序延迟加载类本身