【问题标题】:Method references on instances - why not call method directly (because how can it execute in a different context)?实例上的方法引用 - 为什么不直接调用方法(因为它如何在不同的上下文中执行)?
【发布时间】:2021-04-23 02:57:36
【问题描述】:

我正在尝试从 Oracle Learning on Lambdas and Method References 中理解这个示例代码:

String city = "Munich";
Supplier<String> lambda = city::toUpperCase;
System.out.println(lambda.get());

他们为什么不直接打电话

city.toUpperCase();

这个方法不是和具体的实例变量city绑定的吗? 那么它将如何在不同的上下文中执行以提供 lambdas 的好处 - 我无法理解。

【问题讨论】:

  • 问题不应该是,他们为什么不一开始就写"MUNICH"
  • @Holger 欢迎您提出这个问题。
  • 我想,这有助于理解example的原理。在示例中,字符串是"Munich",您可以首先写"MUNICH"。但是当你有一个 arbitrary 字符串时,你可以通过调用city.toUpperCase() 将它转换为大写。同样,在示例中,供应商是对citytoUpperCase 调用,您可以首先编写city.toUpperCase()"MUNICH"。但是当您有一个任意供应商时,您可以致电get() 请求结果。考虑当方法的参数是String citySupplier&lt;String&gt; s 时会发生什么...

标签: java java-8 method-reference


【解决方案1】:

在您显示的有限代码 sn-p 中,您确实只需调用city.toUpperCase();。在那里使用 lambda 是没有意义的。

你一定忽略了一个更大的教训。我怀疑该教程代码的作者正在演示此类代码的效果,并解释了等效行为。您应该链接到确切的教程页面以获得更多上下文。

lambda 的意义在于您要在代码库中执行该方法引用其他地方。与其在当前代码中立即执行该方法,不如在其他代码上下文中运行该方法。您想将该方法引用作为参数传递给其他方法调用。

【讨论】:

  • 是的。教程页面提供了一个简单的示例来说明“如何做”。不是一个例子来说明“当你应该这样做”。
  • @BasilBourque 这个方法不是和具体的实例变量city绑定的吗?那么它将如何在不同的上下文中执行 - 我无法理解。该视频教程可在 learn.oracle.com Java SE 11 培训上免费获得,直到 4 月 25 日 - 它位于付费墙后面,因此无法提供公共链接。
  • 课程标题是:准备 Java SE 11 认证主题 4 'Lambdas 和 Streams 第 2 部分'。 4 月 25 日前免费访问。
  • @likejudo 参见,例如Objects.requireNonNull(T obj, Supplier<String> messageSupplier)。该方法只会在objnull 并且需要构造NullPointerException 的消息时调用messageSupplier.get()。否则,它根本不会执行,这可能比事先构造一个不需要的字符串更好(因为典型情况应该是输入不是null,并且不会抛出异常)。跨度>
【解决方案2】:

因为那样它就不是“学习 Lambda 和方法引用”的好例子......

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多