IntelliJ 不断建议我用方法引用替换我的 lambda 表达式。
两者之间有任何客观区别吗?
最佳答案
让我提供一些观点,说明为什么我们在语言中添加了这个功能,而显然我们并不严格需要(所有方法 refs 都可以表示为 lambdas。)
请注意,没有正确答案。任何说“总是使用方法引用而不是 lambda”或“总是使用 lambda 而不是方法引用”的人都应该被忽略。
这个问题在本质上与“我什么时候应该使用命名类与匿名类”非常相似?答案是一样的:当你发现它更具可读性时。肯定有肯定是一个或肯定另一个的情况,但中间有很多灰色,必须使用判断。
方法 refs 背后的理论很简单:名称很重要。如果一个方法有一个名称,那么通过名称来引用它,而不是通过最终只是转身调用它的命令式代码包,通常(但不总是!)更清晰易读。
关于性能或计数字符的争论大多是红鲱鱼,你应该忽略它们。目标是编写清晰的代码。很多时候(但不总是!)方法引用在这个指标上获胜,所以我们将它们作为一个选项包括在内,以在这些情况下使用。
关于方法引用是澄清还是混淆意图的一个关键考虑因素是,从上下文中是否可以明显看出所表示的函数的形状是什么。在某些情况下(例如,map(Person::getLastName)
,从上下文中可以清楚地看出,需要一个将一件事映射到另一件事的函数,在这种情况下,方法引用会大放异彩。在其他人,使用方法 ref 需要读者想知道正在描述什么样的函数;这是一个警告信号,表明 lambda 可能更具可读性,即使它更长。
最后,我们发现大多数人一开始远离方法引用,因为他们感觉比 lambda 更新和奇怪,因此最初发现它们“可读性较差”,但时间,当他们习惯了语法时,通常会改变他们的行为并尽可能地倾向于方法引用。因此请注意,您自己的主观初始“可读性较差” react 几乎肯定会导致某些方面的熟悉度偏见,并且在提出风格意见之前,您应该让自己有机会适应两者。
关于java - Lambda 表达式与方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24487805/