Java8-为什么他们提供方法引用?

Java8-为什么他们提供方法引用?,java,lambda,java-8,Java,Lambda,Java 8,打电话有什么好处 names.stream().forEach(System.out::println); 尽管你不得不写更少的代码?在Java8中引入方法引用还有其他好处吗 尽管你不得不写更少的代码?在Java8中引入方法引用还有其他好处吗 P>编写更少的代码足够考虑引入语言特征。C#中有一个类似的特性,名为,它使编写使用委托的代码变得更容易。lambda是匿名类的简写,匿名类可以被认为是命名类的简写。人们可以合理地称它们为“语法糖”,但所有这些特性都可以帮助您编写更少的代码 除了可以缩

打电话有什么好处

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


尽管你不得不写更少的代码?在Java8中引入方法引用还有其他好处吗


尽管你不得不写更少的代码?在Java8中引入方法引用还有其他好处吗

<> P>编写更少的代码足够考虑引入语言特征。C#中有一个类似的特性,名为,它使编写使用委托的代码变得更容易。lambda是匿名类的简写,匿名类可以被认为是命名类的简写。人们可以合理地称它们为“语法糖”,但所有这些特性都可以帮助您编写更少的代码


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

好吧,上面只编写较少代码的一个优点是,第一个示例不必知道参数,只要该函数接口的实现具有相同的签名(->是正确的)你的代码已经编译好了


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

尽管您必须编写更少的代码,但lambdas有什么优点吗?请注意,有很多示例实际上引用了该方法表示更多代码(例如,
MyClassWithLongName::aStaticMethod
)。方法引用仍然是一个优势,因为它减少了出错的机会。方法引用的动机很简单(并且与许多人认为的“较短的”没有太多关系)。方法有名称,方法引用的另一个有用之处是,它们默认符合java.util.function函数接口,因此,您可以对方法进行引用,例如谓词或提供者;命名参数不仅仅是更多的字符,它会带来认知负荷,因为它要求我们在每次解引用时都仔细地遵循它;这也为bug打开了大门(一个不相关的、类似命名的变量可能在主体中被取消引用);方法引用是一个明确的信号,表明lambda不是闭包。换句话说,如果您看到像
(a,b,c,d)->a.foo(b,d,c)
这样的表达式,您必须比像
MyClass::foo
这样的表达式更仔细地阅读它(否则您可能会错过它们不是等价的…)。方法引用指示目标的声明类,而不需要同时声明所有参数类型。
names.stream().forEach(n -> System.out.println(n));