Java 8 中的方法引用,轻松减少代码量,提升可读性!

news/2024/7/8 1:29:19

点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

1. 引言

Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性。 方法引用是lambda表达式的一种特殊类型。它们通常通过引用现有方法来创建简单的lambda表达式。

方法引用包括以下四种类型:

  • 静态方法

  • 特定对象的实例方法

  • 特定类型的任意对象的实例方法

  • 构造方法

在本篇文章中,我们将探讨Java中的方法引用。

2. 引用静态方法

We'll begin with a very simple example, capitalizing and printing a list of Strings:

我们从一个非常简单的示例开始,字符串转成大写并打印:

List<String> messages = Arrays.asList("hello", "baeldung", "readers!");

我们可以通过简单的lambda表达式直接调用 StringUtils.capitalize() 方法:

messages.forEach(word -> StringUtils.capitalize(word));

或者,我们可以使用方法引用来简单地引用 capitalize 静态方法:

messages.forEach(StringUtils::capitalize);

注意,方法引用应使用::运算符。

3. 引用特定对象的实例方法

为了演示这种类型的方法引用,我们新建以下这两个类:

public class Bicycle {private String brand;private Integer frameSize;// standard constructor, getters and setters
}public class BicycleComparator implements Comparator {@Overridepublic int compare(Bicycle a, Bicycle b) {return a.getFrameSize().compareTo(b.getFrameSize());}}

创建一个 BicycleComparator 对象来比较自行车尺寸:

BicycleComparator bikeFrameSizeComparator = new BicycleComparator();

我们可以使用lambda表达式按尺寸大小对自行车进行排序,但需要指定两个自行车实例进行比较:

createBicyclesList().stream().sorted((a, b) -> bikeFrameSizeComparator.compare(a, b));

我们可以使用方法引用让编译器把句柄参数传递给我们:

createBicyclesList().stream().sorted(bikeFrameSizeComparator::compare);

4. 引用特定类型任意对象的实例方法

这种类型的方法引用与前面的示例类似,但不必创建自定义对象来执行比较。

让我们创建一个要排序的Integer 整数列表:

List<Integer> numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18);

如果我们使用经典的 lambda 表达式,这两个参数都需要显式传递,而使用方法引用则要简单得多:

numbers.stream().sorted((a, b) -> a.compareTo(b));
numbers.stream().sorted(Integer::compareTo);

尽管它仍然是一行代码,但是方法引用更容易阅读和理解。

5. 引用构造函数

我们可以像在第一个例子中引用静态方法一样引用构造函数。唯一区别是需要使用new关键字。现在我们用不同品牌的String列表创建一个Bicycle数组:

List<String> bikeBrands = Arrays.asList("Giant", "Scott", "Trek", "GT");

首先,我们将向Bicycle类添加一个新的构造函数:

public Bicycle(String brand) {this.brand = brand;this.frameSize = 0;
}

接下来,我们将使用方法引用中的新构造函数,并从原始的String列表中生成一个Bicycle数组:

bikeBrands.stream().map(Bicycle::new).toArray(Bicycle[]::new);

注意如何使用方法引用调用BicycleArray构造函数,从而使代码看起来更加简洁明了。

6. 其他示例和限制

目前为止,方法引用是一个使代码非常清晰和易读的好方法。但是,我们不能用它们来代替各种lambda表达式,因为它们有一些局限性。

它们的主要局限性是由于它们最大的优点:前一个表达式的输出需要与引用的方法声明的输入参数匹配

看看这个限制的例子:

createBicyclesList().forEach(b -> System.out.printf("Bike brand is '%s' and frame size is '%d'%n",b.getBrand(),b.getFrameSize()));

这个简单的例子不能用方法引用来表示,因为在我们的例子中,printf 方法需要3个参数,而使用*createBicyclesList().forEach()*只允许方法引用一个参数(Bicycle对象)。

最后,我们研究下,如何创建一个可以从lambda表达式引用的no-operation函数。

在本例中,我们希望使用lambda表达式而不使用其参数。

首先,创建 doNothingAtAll 方法:

private static <T> void doNothingAtAll(Object... o) {
}

因为这是一个varargs方法,它可执行在任意 lambda 表达式中,而不管引用的对象或参数的数量。我们看看它的作用:

createBicyclesList().forEach((o) -> MethodReferenceExamples.doNothingAtAll(o));

7. Conclusion

在这篇文章中,我们学习了Java中的方法引用,以及如何使用它们来替换lambda表达式,从而提高了可读性并阐明编程的意图。

热门内容:
  • 订单系统设计思路

  • 超美观的 Vue+Element 开源后台管理 UI

  • Mybatis 使用的 9 种设计模式,真是太有用了

  • 你的登录接口真的安全吗?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

http://lihuaxi.xjx100.cn/news/266749.html

相关文章

干货 | 一文完全理解AUC-ROC曲线

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达来源&#xff1a; https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5 翻译&#xff1a;石头 机器学习模型的性能测量是一项必不可少的工作…

Io流的字节流与缓冲流

当我们队大量数据进行保存时可以用数组&#xff0c;当数据到达一定量时或给用户一个易懂得接口时就可采用IO流&#xff1a; IO流按进行的操作分输出流与输入流InputStream与OutputSteam 按操作的原理来分有2种常见的IO流字节流与缓冲流&#xff1a;这2种IO的的输入输出流都是对…

struts2请求处理过程源代码分析(1)

2019独角兽企业重金招聘Python工程师标准>>> 转载自&#xff1a;http://www.see-source.com/ 源码解析网 网上对于struts2请求处理流程的讲解还是比较多的&#xff0c;有的还是非常详细的&#xff0c;所以这里我就简单地将大概流程总结下&#xff0c;有了个大概印象…

python错误提示:TypeError: ‘builtin_function_or_method‘ object is not subscriptable

[] 换成 () >>> yy.replace[a,s] Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: builtin_function_or_method object is not subscriptable >>> yy.replace(a,s) sbcdef >>>

22.加密与安全相关,证书申请CA(gpg,openssl)

安全机制 信息安全防护的目标保密性 Confidentiality完整性 Integrity可用性 Usability可控制性 Controlability不可否认性 Non-repudiation安全防护环节物理安全&#xff1a;各种设备/主机、机房环境系统安全&#xff1a;主机或设备的操作系统应用安全&#xff1a;各种网络服务…

用Python玩转PPT!

作者 | 陈熹来源 | 早起Python今天本文将基于第三方库pptx&#xff0c;详细讲解如何使用Python操作Office全家桶最后一位——PPT。安装pptx是一个非标准库&#xff0c;需要在命令行中安装pip install python-pptx要注意&#xff0c;安装的时候是python-pptx&#xff0c;而实际调…

求你了,不要再在对外接口中使用枚举类型了!

点击上方蓝色“方志朋”&#xff0c;选择“设为星标”回复“666”获取独家整理的学习资料&#xff01;最近&#xff0c;我们的线上环境出现了一个问题&#xff0c;线上代码在执行过程中抛出了一个IllegalArgumentException&#xff0c;分析堆栈后&#xff0c;发现最根本的的异常…

腾讯优图实验室-计算机视觉(日常实习生招聘)

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达【组内情况介绍】本次的ICCV2021中&#xff0c;在ReID、3D识别及相关方向上中稿5篇&#xff0c; 今年共发表15篇以上CCF A类。在图像识别、图像检索、ReID、3D人体重建等领域…