java - Lambda 表达式与方法引用

标签 java intellij-idea lambda java-8 side-effects

IntelliJ 不断建议我用方法引用替换我的 lambda 表达式。

两者之间有任何客观区别吗?

最佳答案

让我提供一些观点,说明为什么我们在语言中添加了这个功能,而显然我们并不严格需要(所有方法 refs 都可以表示为 lambdas。)

请注意,没有正确答案。任何说“总是使用方法引用而不是 lambda”或“总是使用 lambda 而不是方法引用”的人都应该被忽略。

这个问题在本质上与“我什么时候应该使用命名类与匿名类”非常相似?答案是一样的:当你发现它更具可读性时。肯定有肯定是一个或肯定另一个的情况,但中间有很多灰色,必须使用判断。

方法 refs 背后的理论很简单:名称很重要。如果一个方法有一个名称,那么通过名称来引用它,而不是通过最终只是转身调用它的命令式代码包,通常(但不总是!)更清晰易读。

关于性能或计数字符的争论大多是红鲱鱼,你应该忽略它们。目标是编写清晰的代码。很多时候(但不总是!)方法引用在这个指标上获胜,所以我们将它们作为一个选项包括在内,以在这些情况下使用。

关于方法引用是澄清还是混淆意图的一个关键考虑因素是,从上下文中是否可以明显看出所表示的函数的形状是什么。在某些情况下(例如,map(Person::getLastName),从上下文中可以清楚地看出,需要一个将一件事映射到另一件事的函数,在这种情况下,方法引用会大放异彩。在其他人,使用方法 ref 需要读者想知道正在描述什么样的函数;这是一个警告信号,表明 lambda 可能更具可读性,即使它更长。

最后,我们发现大多数人一开始远离方法引用,因为他们感觉比 lambda 更新和奇怪,因此最初发现它们“可读性较差”,但时间,当他们习惯了语法时,通常会改变他们的行为并尽可能地倾向于方法引用。因此请注意,您自己的主观初始“可读性较差” react 几乎肯定会导致某些方面的熟悉度偏见,并且在提出风格意见之前,您应该让自己有机会适应两者。

关于java - Lambda 表达式与方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24487805/

相关文章:

intellij-idea - 如何删除 IntelliJ IDEA 中添加的线条颜色?

c# - 从表达式中获取字符串属性名称

java - WildFly 部署期间出现错误

java - 使用java将文件从谷歌应用引擎上传到谷歌驱动器

java - Intellij IDEA : Get notified when a Run Configuration is launched

java - PostgreSQL、Hibernate、IntelliJ IDEA - 创建项目

Java 8 将 HashSet 转换为 HashMap

java - 如何将信任证书从 .jks 转换为 .pem?

java - Java如何选择使用哪个构造函数?

intellij-idea - 禁用 Intellij 自动复制到剪贴板