【问题标题】:Method reference of an object in variable vs. returned by method变量中对象的方法引用与方法返回
【发布时间】:2018-05-28 16:01:14
【问题描述】:

我注意到如果我写这样的东西:

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

Android Studio(也可能是 IntelliJ)显示“可以用方法引用替换”的建议。

相反,如果我写

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

Android Studio 什么也没说。

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

foo(view::showError)

foo(getView()::showError)

,分别。

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

【问题讨论】:

  • 你看看apk的大小了吗?

标签: java android-studio intellij-idea lambda method-reference


【解决方案1】:

请注意,这些替代方案都不是完全相同的。

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() 在此特定评估中返回null,则会在特定函数评估中抛出NullPoinerException

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

当然,如果 getView() 是一个微不足道的 getter,每次都返回相同的实例,那么转换将是合法的,但我想 IDE 并没有研究 getView() 的实现来做出这样的决定.由您决定此更改在​​您的应用程序中是否有效。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2016-01-09
      • 2019-02-08
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多