IntelliJ 一直建议我用方法引用替换我的 lambda 表达式。
两者有客观上的区别吗?
原文由 Gerard 发布,翻译遵循 CC BY-SA 4.0 许可协议
IntelliJ 一直建议我用方法引用替换我的 lambda 表达式。
两者有客观上的区别吗?
原文由 Gerard 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
让我提供一些观点,说明为什么我们将此功能添加到语言中,而显然我们并不严格需要(所有方法引用都可以表示为 lambda。)
请注意, _没有正确答案_。任何说“总是使用方法引用而不是 lambda”或“总是使用 lambda 而不是方法引用”的人都应该被忽略。
这个问题在精神上与“我什么时候应该使用命名类与匿名类”非常相似?答案是一样的: _当你发现它更具可读性时_。肯定有一些案例绝对是一个或另一个,但中间有很多灰色地带,必须使用判断力。
方法 refs 背后的理论很简单: _名称很重要_。如果一个方法有一个名称,那么通过名称引用它,而不是通过最终只是转过身来调用它的命令式代码包,通常(但不总是!)更清晰和可读。
关于性能或字符数的争论大多是转移注意力,您应该忽略它们。目标是编写非常清楚其功能的代码。很多时候(但不总是!)方法引用在这个指标上获胜,所以我们将它们作为一个选项包含在内,以在这些情况下使用。
关于方法引用是澄清还是混淆意图的一个关键考虑因素是,从上下文中是否可以明显看出所表示的函数的形状是什么。在某些情况下(例如
map(Person::getLastName)
,从上下文中可以清楚地看出需要将一个事物映射到另一个事物的函数,在这种情况下,方法引用会大放异彩。在其他情况下,使用方法 ref 需要读者想知道正在描述什么样的功能;这是一个警告信号,表明 lambda 可能更具可读性,即使它更长。最后,我们发现大多数人 一开始会 避开方法引用,因为它们感觉比 lambda 更新更怪异,因此最初发现它们“可读性较差”,但随着时间的推移,当他们习惯了这种语法时,通常会改变他们的行为,并在可能的情况下倾向于方法引用。因此请注意,您自己的主观初始“可读性较差”反应几乎肯定会带来某些方面的熟悉偏见,并且在提出风格意见之前,您应该给自己一个机会来适应这两种情况。