我希望两个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();
}
有什么区别?
被称为lambda:如果打电话给map.get("key1").someAction()
,您将获得NPE。
方法参考将在创建时间进行评估,即,当您第一次编写object::notify
时,它立即抛出NPE。
特别是JLS 15.13.3状态:
评估方法参考表达式与方法本身的调用不同。
首先,如果方法参考表达式从表达式名称或主开始,则评估该子表达。如果子表达评估为null,则提高了NullPoInterException,并且方法参考表达式突然完成。