当前位置: 首页 > news >正文

Java方法引用:提高代码可读性和可维护性

前言

在Java 8中,可以使用方法引用(Method Reference)来简化Lambda表达式。方法引用是一种更简洁易懂的语法形式,可以通过指定方法的名称代替Lambda表达式。

本文将介绍方法引用的用法和实现原理,并结合代码案例详细讲解。

方法引用的介绍

方法引用是Java 8中的新特性,它允许直接引用已有 Java 类或对象的方法,并传递它们作为 Lambda 表达式的参数。

方法引用的语法为:对象名::方法名类名::静态方法名

下面是一个简单的例子:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.forEach(System.out::println);

上述代码中,list.forEach(System.out::println)使用了方法引用语法,打印了列表中的每个元素。

方法引用的用法

方法引用可以分为四种类型:

对象::实例方法

这种方法引用使用一个实例对象来调用方法,语法为:对象名::方法名

下面是一个例子:

List<Integer> list = Arrays.asList(1, 2, 3);
list.forEach(System.out::println);

上述代码中,System.out::println表示对输出流 System.out 调用方法 println。它等同于 Lambda 表达式 (x) -> System.out.println(x)

类::静态方法

这种方法引用使用一个类来调用它的静态方法,语法为:类名::静态方法名

下面是一个例子:

List<Integer> list = Arrays.asList(1, 2, 3);
Collections.sort(list, Integer::compareTo);

上述代码中,Integer::compareTo 表示对 Integer 类调用 compareTo 方法。它等同于 Lambda 表达式 (x, y) -> Integer.compare(x, y)

类::实例方法

这种方法引用使用一个 Class 的实例来调用它的实例方法,语法为:类名::方法名

下面是一个例子:

String str = "hello world";
Function<Integer, Character> fun = str::charAt;

上述代码中,str::charAt 表示对字符串对象 str 调用 charAt 方法。它等同于 Lambda 表达式 (x) -> str.charAt(x)

构造函数引用

这种方法引用使用构造函数来创建新的对象实例,语法为:类名::new

下面是一个例子:

Supplier<List<String>> supplier = ArrayList::new;

上述代码中,ArrayList::new 表示使用 ArrayList 的无参构造函数来创建供应商(Supplier),它等同于 Lambda 表达式 () -> new ArrayList<>()

方法引用的实现原理

方法引用的实现原理就是调用关键方法 java.util.function.MethodHandles.lookup() ,它可以获得一个 MethodHandles.Lookup 对象,该对象可以通过 findVirtualfindStaticfindConstructor 等方法来查找类中的方法。

下面是一个例子:

MethodHandle handle = MethodHandles.lookup().findVirtual(String.class, "length", MethodType.methodType(int.class));

上述代码中,MethodHandles.lookup().findVirtual 表示在 String 类中查找名为 length 的实例方法,并返回一个 MethodHandle 对象。

在 Java 8 中,方法引用被实现为 Lambda 表达式的语法糖,即当一个 Lambda 表达式只调用一个已经存在的方法时,就可以简化成方法引用的形式,从而提高代码的可读性和可维护性。

总结

本文介绍了Java方法引用的用法和实现原理,相信对于初学者来说有所帮助。Java方法引用可以简化代码,提高代码可读性和可维护性,适用于大多数情况。在实际开发中,根据场景选择合适的方法引用类型,能够使代码变得更加高效,易于维护。

相关文章:

Java方法引用:提高代码可读性和可维护性

前言 在Java 8中&#xff0c;可以使用方法引用&#xff08;Method Reference&#xff09;来简化Lambda表达式。方法引用是一种更简洁易懂的语法形式&#xff0c;可以通过指定方法的名称代替Lambda表达式。 本文将介绍方法引用的用法和实现原理&#xff0c;并结合代码案例详细…...

如何使用CSS和JS实现一个响应式的滚动时间轴

随着互联网的发展&#xff0c;网站的界面设计越来越重要。吸引用户的关注、提高用户体验已经成为了许多网站的目标。而在实现各种复杂的界面效果中&#xff0c;CSS与JS的组合无疑是开发者的得力工具。本文将介绍如何使用CSS和JS实现一个响应式的滚动时间轴。 1.需求分析 在开…...

Feign组件的使用及开发中使用方式

在微服务的服务集群中服务与服务之间需要调用暴露的服务.那么就需要在服务内部发送http请求&#xff0c; 我们可以使用较为老的HttpClient实现&#xff0c;也可以使用SpringCloud提供的RestTemplate类调用对应的方法来发送对应的请求。 说明&#xff1a; 现在有两个微服务一个是…...

html css 面试题

1. 如何理解HTML语义化 1&#xff0c;可读性&#xff0c;易读性 2&#xff0c;seo搜索引擎更容易读懂 2&#xff0c;哪些是块元素&#xff0c;哪些是内联元素 1&#xff1a;div&#xff0c;h1&#xff0c;table&#xff0c;ul&#xff0c;p 2&#xff1a;span&#xff0c; img…...

LeetCode_双指针_中等_24.两两交换链表中的节点

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&a…...

【openGauss实战11】性能报告WDR深度解读

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…...

Vue3实现打字机效果

typeit 介绍 typeit是一款轻量级打字机特效插件。该打印机特效可以设置打字速度&#xff0c;是否显示光标&#xff0c;是否换行和延迟时间等属性&#xff0c;它可以打印单行文本和多行文本&#xff0c;并具有可缩放、响应式等特点。官方文档 安装 # npm npm install typeit # …...

maven无法依赖spring-cloud-stater-zipkin如何解决?

当 Maven 无法依赖 spring-cloud-starter-zipkin 时&#xff0c;您可以尝试以下方法解决&#xff1a; 确保拼写正确&#xff1a;请检查项目中的 pom.xml 文件&#xff0c;确保依赖的拼写正确。正确的依赖名称应为&#xff1a;spring-cloud-starter-zipkin。添加 Spring Cloud …...

实战踩坑---MFC---CreateEvent

使用事件CreateEvent注意事项 HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性 BOOLbManualReset,// 复位方式 BOOLbInitialState,// 初始状态 LPCTSTRlpName // 对象名称 );[1] 参数 lpEventAttributes[输入] 一个指向SECURITY_ATTRIBUTES结构…...

JavaWeb学习------jQuery

JavaWeb学习------jQuery jQuery函数库下载 jQuery函数库下载官网&#xff1a;Download jQuery | jQuery配套资料&#xff0c;免费下载 链接&#xff1a;https://pan.baidu.com/s/1aXBfItEYG4uM53u6PUEMTg 提取码&#xff1a;6c9i 然后下载&#xff1f; 来到官网&#xf…...

米哈游测开岗 【一面总结】

目录 1.黑盒测试与白盒测试的区别 2.测试一个下单功能 3.get与post的区别 4.一次get请求产生几个数据包 5.常用的linux命令 6.进程与线程的区别 7.数据库查询如何去重 8.MySql怎么连接两张表&#xff0c;有什么区别 9.说说索引 10.cookie 和 session 的区别 (会话管…...

微服务 Spring Boot 整合Redis 实现优惠卷秒杀 一人一单

文章目录 一、什么是全局唯一ID ⛅全局唯一ID ⚡Redis实现全局唯一ID 二、环境准备 三、实现秒杀下单 四、库存超卖问题 ⏳问题分析 ⌚ 乐观锁解决库存超卖 ✅Jmeter 测试 五、优惠卷秒杀 实现一人一单 ⛵小结 一、什么是全局唯一ID ⛅全局唯一ID 在分布式系统中,经常需要使用…...

构建OVS网络

构建OVS网络 1. 配置虚拟机环境 &#xff08;1&#xff09;配置虚拟机交换机 1 创建一个名为br-xd的虚拟交换机。 # ovs-vsctl add-br br-xd 2 查询虚拟交换机。 # ovs-vsctl show 5a1cd870-fc31-4820-a7f4-b75c19450582 Bridge br-xd Port br-xd …...

【Python】万能之王 Lambda 函数详解

Python 提供了非常多的库和内置函数。有不同的方法可以执行相同的任务&#xff0c;而在 Python 中&#xff0c;有个万能之王函数&#xff1a;lambda 函数&#xff0c;它可以以不同的方式在任何地方使用。今天云朵君将和大家一起研究下这个万能之王&#xff01; Lambda 函数简介…...

手把手教你怎么搭建自己的AI数字人直播间?帮你24小时不间断直播卖货

在搭建AI数字人直播间之前&#xff0c;您需要了解数字人技术。 一、什么是AI数字人、数字人直播间&#xff1f; 数字人是一种由人工智能技术构建的虚拟人物&#xff0c;其外貌、行为、语言等特征与真实人物相似&#xff0c;可以与人进行互动。数字人可以通过语音合成、人脸识…...

MySQL性能监控全掌握,快来get关键指标及采集方法!

数据库中间件监控实战&#xff0c;MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题&#xff0c;提升数据库可用性。 1 整体思路 监控哪类指标&#xff1f; 如何采集数据&#xff1f; 第10讲监控方法论如何落地&#xff1f; 这些就可以在MySQL中应用起来。…...

sed进阶之保留空间和排除命令

shell脚本编程系列 保留空间 模式空间&#xff08;pattern space&#xff09;是一块活跃的缓冲区&#xff0c;在sed编辑器执行命令时保存着待检查的文本&#xff0c;但它并不是sed编辑器保存文本的唯一空间。sed编辑器还有另一块称作保留空间&#xff08;hold space&#xff0…...

21安徽练习

题目分为4部分 APK 集群 流量 exe 我尽量都做一下&#xff0c;逆向不是很会&#xff0c;就当提升自己。 [填空题]请获取app安装包的SHA256校验值&#xff08;格式&#xff1a;不区分大小写&#xff09;&#xff08;10分&#xff09; e15095d49efdccb0ca9b2ee125e4d8136cac5…...

【VAR | 时间序列】应用VAR模型时的15个注意点

一、前言 向量自回归&#xff08;VAR,Vector Auto regression&#xff09;常用于预测相互联系的时间序列系统以及分析随机扰动对变量系统的动态影响。 VAR方法通过把系统中每一个内生变量,作为系统中所有内生变量的滞后值的函数来构造模型&#xff0c;从而回避了结构化模型的…...

校招在线测评题目汇总

图形找规律题 https://blog.csdn.net/mxj1428295019/article/details/129627461https://blog.csdn.net/Yujian2563/article/details/124266574?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-124266574-blo…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...