我希望两个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();
}
有什么区别?
答案 0 :(得分:6)
lambda在被调用时会被评估:如果你调用map.get("key1").someAction()
,你就会得到一个NPE。
方法参考在创建时进行评估,即当您第一次编写object::notify
时,会立即抛出NPE。
特别是the JLS 15.13.3声明:
方法参考表达式的评估不同于方法本身的调用 首先,如果方法引用表达式以ExpressionName或Primary开头,则计算此子表达式。如果子表达式求值为null,则引发NullPointerException,并且方法引用表达式突然完成。