首页 > 解决方案 > 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

所以要么这两个声明不等价,这很难承认,或者,如果它们是等价的,考虑到它们在相同的上下文中被调用,具有相同的参数,它们应该产生相同的结果。不是矛盾吗?
非常感谢任何可以在这里遮光的人。
亲切的问候,尼古拉斯

标签: javalambdajava-8anonymous-classfunctional-interface

解决方案


声明不等价。由于可变阴影,第一种方法可以转换为:

public static BiFunction<Integer, Integer, Integer> addTwoIntegers(Integer i1, Integer i2) {
    return (i1x, i2x) -> i1x + i2x;
}

第二种方法函数表达式是指addTwoIntegers2方法参数i1i2而不是函数参数i1xi2xi1在函数闭包中i2可用,因为它们0的结果都是0.


推荐阅读