IntelliJ一直建议我用方法引用替换我的lambda表达式。
两者之间有客观差异吗?
Type[]::new
)。运行时生成的匿名类将是相同的。JRE在它们之间没有任何区别。因此,使用方法引用将在编译的代码中为您节省一个方法,另一方面,在进行逐步调试时不能停下来……
IntelliJ一直建议我用方法引用替换我的lambda表达式。
两者之间有客观差异吗?
Type[]::new
)。运行时生成的匿名类将是相同的。JRE在它们之间没有任何区别。因此,使用方法引用将在编译的代码中为您节省一个方法,另一方面,在进行逐步调试时不能停下来……
Answers:
让我对为什么我们在语言中添加此功能的原因提供一些看法,但显然我们并不一定要严格要求(所有方法引用都可以表示为lambda)。
请注意,没有正确的答案。任何说“总是使用方法ref代替lambda”或“总是使用lambda代替方法ref”的人都应该被忽略。
这个问题在本质上与“何时应该使用命名类还是匿名类”非常相似?答案是相同的:当您发现它更具可读性时。当然,在某些情况下肯定是一个或另一个,但中间有很多灰色,必须使用判断力。
方法refs背后的理论很简单:名称很重要。如果一个方法有一个名称,那么通常(但不总是如此!)更清晰易读,而不是用一个命令包(最终只是转过来调用它)来命名。
关于性能或关于字符计数的争论主要是红色鲱鱼,您应该忽略它们。目标是编写清晰易懂的代码。方法引用经常(但并非总是如此!)在此度量标准上获胜,因此我们将它们作为一个选项包括在内,以便在这些情况下使用。
关于方法引用是否澄清或模糊意图的关键考虑因素是从上下文是否明显看出所表示的函数的形状是什么。在某些情况下(例如,map(Person::getLastName)
从上下文中可以很明显地看出,需要将一个事物映射到另一事物的函数,而在这种情况下,方法引用很有用。在其他情况下,使用方法ref要求读者想知道哪种类型函数的功能正在描述中;这是一个警告信号,即使更长,lambda也可能更具可读性。
最后,我们发现大多数人起初避开方法引用,因为他们觉得自己比lambda更新颖,更奇怪,因此最初发现它们“可读性差”,但是随着时间的流逝,当他们习惯了语法时,通常会更改其行为,并在可能时偏向于方法引用。因此请注意,您自己的主观初始“难以理解的”反应几乎肯定会带来一些熟悉性方面的偏见,并且您应该给自己一个机会,在提出风格上的见解之前先对两者都感到满意。
LiveData
内的一个Android ,Fragment
我将Event
其转换为由ViewModel
... 触发的...,而当Android返回相同的Fragment
.. 时,会发生不同的行为。 .so我很难简化一个问题
由多个语句组成的长lambda表达式可能会降低代码的可读性。在这种情况下,提取方法中的那些语句并引用它可能是一个更好的选择。
另一个原因可能是可重用性。无需复制并粘贴几个语句的lambda表达式,您可以构造一个方法并从代码的不同位置调用它。
houses.map(House::getName)
和houses.map(h -> h.getName())
。Lambda少占用两个字符。的确,类型不是显式的,但是任何IDE都会告诉您,此外,当类型明显时,应使用lambda。我可能会同意您的可重用性,但是lambda很小,因此可以将它们链接起来,而不用创建大型的特定方法。从这个意义上讲,小方法比某些大而复杂的方法更可重用,并且由于lambda的清晰(在某种程度上是冗长),它们仍然易于阅读。
House
是一个非常好的例子。那呢ThreeStoryRedBrickHouseWithBlueDoors
?我更喜欢多参数Lambda的方法引用,有时还要强调Lambda只是关于单个方法的调用。有少去错的方法参考:你可能在使用现场拼错的说法,不小心指从外部范围等变量