变量中对象的方法引用与方法返回的对象

Method reference of an object in variable vs. returned by method

我注意到如果我这样写:

View view = getView();
foo(error -> view.showError(error));

Android Studio(可能还有 IntelliJ)显示了建议 "Can be replaced with method reference"。

相反,如果我写

foo(error -> getView().showError(error));

Android 工作室什么也没说。

但在这两种情况下我都可以使用方法引用:

foo(view::showError)

foo(getView()::showError)

,分别

这两种形式在功能上是否不同?他们似乎在做同样的事情,但 Android Studio 似乎不同意。

两者完全一样,但是如果你不多次使用一个对象,那么androidstudio给出了直接使用方法引用的建议。因为如果您不打算再次使用它,那么保存对象引用是没有意义的。希望对你有帮助。

请注意,none 这些选项完全相同。

View view = getView();
foo(error -> view.showError(error));

将立即评估 getView(),但仅在实际评估函数时调用 showError(error)(但随后,每次)。如果 viewnull,则在计算函数时将抛出 NullPoinerException

View view = getView();
foo(view::showError);

将立即评估 getView() 并在 viewnull 时立即抛出 NullPoinerExceptionshowError(error) 将在实际计算函数时调用;此时保证view不是null.

foo(error -> getView().showError(error));

只会在函数实际被求值时才求值getView();它每次都可以评估不同的结果。因此,如果在此特定评估中 getView() returns null,则将在特定函数评估中抛出 NullPoinerException

您的 IDE 建议将第一个变体转换为第二个变体,因为它在语义上是等价的,只要 view 不是 null。相比之下,即使在非 null 情况下,第三个变体也有显着不同,因为每次重新评估 getView() 可能会导致与早期绑定接收器实例不同的结果。另见“”。

当然,如果 getView() 是一个微不足道的 getter 每次总是返回相同的实例,转换将是合法的,但我认为 IDE 看起来不进入执行 getView() 做出这样的决定。由您决定此更改在​​您的应用程序中是否有效。