, исследуя функциональное программирование на 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;
}
Первое объявление - это традиционный анонимный класс, а второе - лямбда-функция, но в противном случае они должны быть эквивалентными.Теперь, вызывая их следующим образом:
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
Так что либо эти два объявления не эквивалентны, что трудно признать, либо, если они эквивалентныпри условии, что они вызываются в одном контексте с одинаковыми параметрами, они должны давать одинаковый результат.Разве это не противоречие?
Огромное спасибо заранее тому, кто сможет затенить здесь немного света.
С уважением, Николас