方法参考和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();
}

有什么区别?

被称为lambda:如果打电话给map.get("key1").someAction(),您将获得NPE。

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

特别是JLS 15.13.3状态:

评估方法参考表达式与方法本身的调用不同。
首先,如果方法参考表达式从表达式名称或主开始,则评估该子表达。如果子表达评估为null,则提高了NullPoInterException,并且方法参考表达式突然完成。

最新更新