方法引用与lambda

时间:2016-12-30 11:00:14

标签: java lambda

我希望两个put操作都会在以下代码中抛出NullPointerException,但实际上lambda表达式工作正常,而方法引用只会抛出NPE。

public static void main(String... args) {
    Object object = null;
    Map<String, FuncInterface> map = new HashMap<>();

    map.put("key1", () -> object.notify());    // works
    map.put("key2", object::notify);           // throws NPE
}

@FunctionalInterface
private interface FuncInterface {
    public void someAction();
}

有什么区别?

1 个答案:

答案 0 :(得分:6)

lambda在被调用时会被评估:如果你调用map.get("key1").someAction(),你就会得到一个NPE。

方法参考在创建时进行评估,即当您第一次编写object::notify时,会立即抛出NPE。

特别是the JLS 15.13.3声明:

  

方法参考表达式的评估不同于方法本身的调用   首先,如果方法引用表达式以ExpressionName或Primary开头,则计算此子表达式。如果子表达式求值为null,则引发NullPointerException,并且方法引用表达式突然完成。