ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

方法引用优于lambda表达式

2020-12-09 05:32:06  阅读:197  来源: 互联网

标签:优于 映射 对象 代码 引用 方法 表达式 lambda


lambda 优于匿名类的主要优点是它更简洁。Java 提供了一种生成函数对象的方法,比 lambda 还
要简洁,那就是:方法引用(method references)下面是一段程序代码片段,它维护一个从任意键到
整数值的映射。如果将该值解释为键的实例个数,则该程序是一个多重集合的实现。该代码的功能是,
根据键找到整数值,然后在此基础上加 1:

map.merge(key, 1, (count, incr) -> count + incr);

此代码使用 merge 方法,该方法已添加到 Java 8 中的 Map 接口中。如果没有给定键
的映射,则该方法只是插入给定值; 如果映射已经存在,则合并给定函数应用于当前值和给定值,并用
结果覆盖当前值
从 Java 8 开始, Integer 类
(和所有其他包装数字基本类型)提供了一个静态方法总和,和它完全相同,我们可以简单地传递一个
对这个方法的引用.
map.merge(key, 1, Integer::sum);
方法的参数越多,你可以通过方法引用消除更多的样板。 然而,在一些 lambda 中,选择的参数名
称提供了有用的文档,使得 lambda 比方法引用更具可读性和可维护性,即使 lambda 看起来更长。
只要方法引用能做的事情,就没有 lambda 不能完成的(只有一种情况例外 - 如果你好奇的话,参
见 JLS,9.9-2)。 也就是说,使用方法引用通常会得到更短,更清晰的代码。 如果 lambda 变得太长
或太复杂,它们也会给你一个结果:你可以从 lambda 中提取代码到一个新的方法中,并用对该方法的
引用代替 lambda。 你可以给这个方法一个好名字,并把它文档记录下来

偶尔,lambda 会比方法引用更简洁。这种情况经常发生在方法与 lambda 相同的
类中。例如,考虑这段代码,它被假定出现在一个名为 GoshThisClassNameIsHumongous 的类中:
service.execute(GoshThisClassNameIsHumongous::action);
这个 lambda 类似于等价于下面的代码:
service.execute(() -> action());
使用方法引用的代码段并不比使用 lambda 的代码片段更短也不清晰,所以优先选择后者
许多方法引用是指静态方法,但有 4 种方法没有引用静态方法。 其中两个 Lambda 等式是特定
(bound)和任意(unbound)对象方法引用。 在特定对象引用中,接收对象在方法引用中指定。 特定
对象引用在本质上与静态引用类似:函数对象与引用的方法具有相同的参数。 在任意对象引用中,接收
对象在应用函数对象时通过方法的声明参数之前的附加参数指定。 任意对象引用通常用作流管道
(pipelines)中的映射和过滤方法(条目 45)

总之,方法引用通常为 lambda 提供一个更简洁的选择。 如果方法引用看起来更简短更清晰,请使
用它们;否则,还是坚持 lambda。

标签:优于,映射,对象,代码,引用,方法,表达式,lambda
来源: https://www.cnblogs.com/lIllIll/p/14106602.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有