【问题标题】:Why does Java 8 provide method references?为什么 Java 8 提供方法引用?
【发布时间】:2023-03-30 16:22:02
【问题描述】:

叫什么更好

names.stream().forEach(System.out::println);

names.stream().forEach(n -> System.out.println(n));

尽管您必须编写更少的代码?在 Java 8 中引入方法引用还有其他好处吗?

【问题讨论】:

  • 尽管您必须编写更少的代码,但 lambdas 有什么优势吗?
  • 请注意,有很多示例方法引用实际上意味着更多代码(例如MyClassWithLongName::aStaticMethod)。即使在那里,方法引用仍然是一个优势,因为它减少了出错的机会。
  • 方法引用的动机很简单(并且与许多人认为的“更短”几乎没有多大关系。)方法具有名称,并引用某些东西顾名思义,通常比其他名称更清晰。
  • 方法引用的另一个有用之处是它们默认符合 java.util.function 功能接口,因此您可以将方法引用用于诸如谓词或供应商之类的东西。跨度>

标签: java lambda java-8


【解决方案1】:

尽管您必须编写更少的代码?在 Java 8 中引入方法引用还有其他好处吗?

编写更少的代码就足以考虑引入语言功能。 C# 中有一个类似的功能,称为method groups,它可以更轻松地编写使用委托的代码。 Lambda 是匿名类的简写,匿名类可以被认为是命名类的简写。可以合理地称它们为“语法糖”,但所有这些功能都可以帮助您编写更少的代码。

除了让您缩短代码之外,该功能还有可能帮助 Java 编译器的设计者生成更高效的代码。例如,可以避免为每个包装方法引用的 lambda 生成全新的类型。

【讨论】:

  • 我要提到的其他优点:方法引用提供了“无点”编程风格的感觉;命名参数不仅仅是更多的字符,它会引起认知负担,因为它需要我们仔细遵循它,直到每次取消引用;这也为错误打开了大门(一个不相关的、类似名称的变量可能在正文中被取消引用);方法引用是 lambda 不是闭包的明确信号。
  • 换句话说,如果你看到像(a,b,c,d)->a.foo(b,d,c)这样的表达式,你必须比MyClass::foo这样的表达式更仔细地阅读它(否则你可能会错过它们不是 i> 等价的……)。并且方法引用指示目标的声明类,无需同时声明所有参数类型。
【解决方案2】:

好吧,除了编写更少的代码之外,一个优点是,第一个示例不必知道参数,只要该功能接口的实现具有相同的签名(-> 是正确的)您的代码得到编译。

如果功能接口的签名发生变化并且实现的签名发生了类似的变化,那么这些变化只需要在那里应用,而不是在那个粘合代码上。

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 2010-11-08
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2016-10-31
    相关资源
    最近更新 更多