java - 方法引用和 lambda 之间的区别

标签 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();
}

有什么区别?

最佳答案

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

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

特别是,the JLS 15.13.3状态:

Evaluation of a method reference expression is distinct from invocation of the method itself.
First, if the method reference expression begins with an ExpressionName or a Primary, this subexpression is evaluated. If the subexpression evaluates to null, a NullPointerException is raised, and the method reference expression completes abruptly.

关于java - 方法引用和 lambda 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41395147/

相关文章:

Java Random.nextDouble() 概率

java - 在 Android Studio 中播放声音的按钮不播放

java - 有没有办法比较 lambda 表达式?

c++ - g++ 不允许在 lambda 中通过引用广义捕获 const 对象?

spring - Spring bean 创建时出现奇怪的 lambda 错误

java - 朱尼特。如何测试方法中调用其他类构造函数的方法

java - 是否有开源的 Android 电子邮件客户端?

Java - 如果字段具有相同名称,如何访问外部类字段

python - Spark 中使用 Lambda 进行列表转换

c++ - 将 lambda 推送到 C++ STL 队列导致段错误