变量中对象的方法引用与方法返回的对象
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)
(但随后,每次)。如果 view
为 null
,则在计算函数时将抛出 NullPoinerException
。
View view = getView();
foo(view::showError);
将立即评估 getView()
并在 view
为 null
时立即抛出 NullPoinerException
。 showError(error)
将在实际计算函数时调用;此时保证view
不是null
.
foo(error -> getView().showError(error));
只会在函数实际被求值时才求值getView()
;它每次都可以评估不同的结果。因此,如果在此特定评估中 getView()
returns null
,则将在特定函数评估中抛出 NullPoinerException
。
您的 IDE 建议将第一个变体转换为第二个变体,因为它在语义上是等价的,只要 view
不是 null
。相比之下,即使在非 null
情况下,第三个变体也有显着不同,因为每次重新评估 getView()
可能会导致与早期绑定接收器实例不同的结果。另见“”。
当然,如果 getView()
是一个微不足道的 getter 每次总是返回相同的实例,转换将是合法的,但我认为 IDE 看起来不进入执行 getView()
做出这样的决定。由您决定此更改在您的应用程序中是否有效。
我注意到如果我这样写:
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)
(但随后,每次)。如果 view
为 null
,则在计算函数时将抛出 NullPoinerException
。
View view = getView();
foo(view::showError);
将立即评估 getView()
并在 view
为 null
时立即抛出 NullPoinerException
。 showError(error)
将在实际计算函数时调用;此时保证view
不是null
.
foo(error -> getView().showError(error));
只会在函数实际被求值时才求值getView()
;它每次都可以评估不同的结果。因此,如果在此特定评估中 getView()
returns null
,则将在特定函数评估中抛出 NullPoinerException
。
您的 IDE 建议将第一个变体转换为第二个变体,因为它在语义上是等价的,只要 view
不是 null
。相比之下,即使在非 null
情况下,第三个变体也有显着不同,因为每次重新评估 getView()
可能会导致与早期绑定接收器实例不同的结果。另见“
当然,如果 getView()
是一个微不足道的 getter 每次总是返回相同的实例,转换将是合法的,但我认为 IDE 看起来不进入执行 getView()
做出这样的决定。由您决定此更改在您的应用程序中是否有效。