【Java学习】方法的引用

  所属专栏:Java学习 

在这里插入图片描述

🍁1. 方法引用

方法的引用:把已经存在的方法拿来使用,当作函数式接口中抽象方法的方法体

:: "是方法引用符

方法引用时需要注意:

1. 需要有函数式接口

2. 被引用的方法必须存在

3. 被引用的方法的形参和返回值要和抽象方法保持一致

4. 被引用的方法的功能要满足当前的需求

 以Arrays中的静态方法 sort() 为例,其中的参数就是一个函数式接口,先来用匿名内部类和lambda的方式演示一下

 需求:把数组中的元素降序排列

public class Demo1 {public static void main(String[] args) {//把数组中的内容倒序排列Integer[] arr = {2, 1, 4, 5, 3};//匿名内部类的方式Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});// lambda表达式Arrays.sort(arr, (Integer o1, Integer o2) -> {return o2 - o1;});// lambda表达式简化版本Arrays.sort(arr, (o1, o2) -> o2 - o1);System.out.println(Arrays.toString(arr));}
}

接下来看方法引用的方式

public class Demo1 {public static void main(String[] args) {//把数组中的内容倒序排列Integer[] arr = {2, 1, 4, 5, 3};//方法引用Arrays.sort(arr, Demo1::subtraction);System.out.println(Arrays.toString(arr));}public static int subtraction(int num1, int num2) {return num2 - num1;}
}

🍁2. 方法引用的分类 

🍁2.1 引用静态方法

格式: 类 :: 方法名

需求:获取集合中的数字部分

如果说使用之前的方法来解决,就是再定义一个集合,在循环中调用parseInt()方法,再把结果添加到新集合中

public class Demo2 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "1", "2", "3", "4");//匿名内部类方式arrayList.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {int res = Integer.parseInt(s);return res;}}).forEach(s -> System.out.print(s));System.out.println();//方法引用arrayList.stream().map(Integer::parseInt).forEach(s -> System.out.print(s));}
}

这里正好符合方法引用的条件 

🍁2.2 引用成员方法 

格式:

其他类:其他类的对象 :: 方法名

本类中:this :: 方法名

父类中:super :: 方法名

需求:找出集合中以 'a' 开头并且长度大于2的字符串

这里在另一个类中定义了一个专门进行字符串判断的方法,并且参数类型和返回值都和用到的抽象方法一致,这时就可以使用方法引用了 

🍁2.3 引用构造方法

格式:类名 :: new

需求:把集合中的字符串封装成Student对象收集到List集合中

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public Student(String s) {this.name = s.split(",")[0];this.age = Integer.parseInt(s.split(",")[1]);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

public class Demo4 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "张三,23", "李四,21", "王五,21");//把集合中的字符串封装成Student对象收集到List集合中//之前stream流的写法List<Student> list1 = arrayList.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {return new Student(s.split(",")[0], Integer.parseInt(s.split(",")[1]));}}).collect(Collectors.toList());System.out.println(list1);//引用构造方法List<Student> list2 = arrayList.stream().map(Student::new).collect(Collectors.toList());System.out.println(list2);}
}

在使用引用构造方法的时候,由于需要保证被引用的方法的形参和返回值要和抽象方法保持一致,所以要重新再写一个符合条件的构造方法才可以

🍁3. 使用类名引用成员方法

 这里的规则是要稍微变一下的,在刚开始提到的第三条中 “被引用的方法的形参和返回值要和抽象方法保持一致” 要更改为被引用方法的形参要和抽象方法的第二个参数到最后一个形参保持一致,返回值需要保持一致

对于抽象方法中的形参:第一个参数表示被引用方法的调用者,决定了可以引用哪些类中的方法,在Stream流中,第一个参数一般都表示流里面的每一个数据,如果说流里面的是字符串类型,那么使用这种方式进行方法引用,只能用String这个类中的方法

第二个参数到最后一个参数,需要和引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法

public class Demo5 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "aaa", "bbb", "ccc", "ddd");//把集合中的字符串变为大写之后进行输出arrayList.stream().map(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}).forEach(s -> System.out.print(s + " "));System.out.println();//方法引用arrayList.stream().map(String::toUpperCase).forEach(s -> System.out.print(s + " "));}
}

这里抽象方法的方法体只有一个参数,引用的方法需要是无参的成员方法

🍁4. 引用数组的构造方法

引用数组的构造方法就是为了创建一个数组,创建的数组类型要和流中的数据类型保持一致

格式:数据类型[ ]  :: new 

需求:把集合中的数据收集起来放在数组中

public class Demo6 {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();Collections.addAll(arrayList,1,2,3,4,5);//匿名内部类方式Integer[] array1 = arrayList.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});System.out.println(Arrays.toString(array1));//数组引用构造方法Integer[] array2 = arrayList.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(array2));}
}

🍁5. 方法引用的优点 

简洁性:方法引用通常比Lambda表达式更简洁,特别是当Lambda表达式只是简单地调用一个已存在的方法时。

可读性:对于熟悉的方法名,方法引用比Lambda表达式更容易理解。

减少样本模板:方法引用减少了编写Lambda表达式时的样板代码,使代码更加清晰。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403194.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈SIMD、向量化处理及其在StarRocks中的应用

前言 单指令流多数据流(SIMD)及其衍生出来的向量化处理技术已经有了相当的历史&#xff0c;并且也是高性能数据库、计算引擎、多媒体库等组件的标配利器。笔者在两年多前曾经做过一次有关该主题的内部Geek分享&#xff0c;但可能是由于这个topic离实际研发场景比较远&#xff0…

3:html(CSS):基础语法3

3.1网页布局与id 3.1.1网页布局 在这里将使用<div>分成一个一个的块&#xff0c;然后进行CSS的美化。这里要说一下html是一个前端的代码&#xff0c;但是它写出来的东西单调缺少美感&#xff0c;CSS就是进行美化的&#xff0c;这里我们使用类的概念来美化我们的网站。 …

X-Recon:一款针对Web安全的XSS安全扫描检测工具

关于X-Recon X-Recon是一款功能强大的Web安全扫描与检测工具&#xff0c;该工具能够帮助广大研究人员识别网页端输入数据&#xff0c;并执行XSS扫描任务。 功能介绍 1、子域名发现&#xff1a;检索目标网站的相关子域名并将其整合到白名单中。这些子域名可在抓取过程中使用&am…

Vue+ElementUI技巧分享:创建一个带有进度显示的文件下载和打包组件

在现代前端开发中&#xff0c;用户体验至关重要&#xff0c;尤其是在处理文件下载时。为用户提供实时的下载进度显示和打包功能&#xff0c;不仅能提升用户体验&#xff0c;还能使应用更具专业性。在本文中&#xff0c;我们将创建一个 Vue 组件&#xff0c;用于显示文件下载进度…

与人打交道的七个绝招

与人打交道的七个绝招&#xff0c;学会了让你混得风生水起&#xff01; 一、跟强者打交道&#xff0c;别绕圈子。就事论事&#xff0c;直奔主题&#xff1b; 二、跟没钱的人打交道&#xff0c;就直接告诉他能挣多少钱&#xff1b; 三、跟小人打交道&#xff0c;越虚假越好&…

URP平面阴影合批处理 shadow

闲谈 相信大家在日常工作中发现了一个问题 &#xff0c; urp下虽然可以做到3个Pass 去写我们想要的效果&#xff0c;但是&#xff0c;不能合批&#xff08;不能合批&#xff0c;那不是我们CPU要干冒烟~&#xff01;&#xff09; 好家伙&#xff0c;熊猫老师的偏方来了 &#x…

JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件

鼠标滚轮滚动事件&#xff1a;onwheel 获取鼠标滚轮滚动的方向&#xff1a;wheelDelta 比如&#xff1a;向上滚动&#xff1a;109 &#xff08;所有正值都是向上&#xff09; 向下滚动&#xff1a;-109&#xff08;所有负值都是向下&#xff09; 注意&#xff1a;当…

基于华为atlas下的yolov5+BoT-SORT/ByteTrack煤矿箕斗状态识别大探索

写在前面&#xff1a; 本项目的代码原型基于yolov5yolov8。其中检测模型使用的yolov5&#xff0c;跟踪模型使用的yolov8。 这里说明以下&#xff0c;为什么不整体都选择yolov8呢&#xff0c;v8无疑是比v5优秀的&#xff0c;但是atlas这块经过不断尝试没有过去&#xff0c;所以…

AWS boto3 脚本访问 AWS 资源

AWS boto3 脚本访问 AWS 资源 引言boto3主要功能常见用例安装和基本使用 boto3.Client() 低级客户端基本用法关键参数 boto3.resource() 高级客户端常见参数用法 boto3.resource VS boto3.client相似点不同点总结 关于身份验证凭证隐式身份凭证显式身份验证凭证assuem role如何…

出海笔记精华问答 | 第四期

更新出海问答第四期&#xff0c;希望可以继续帮助大家解决问题哈。 Q1:当stripe把资金全退给客户但是货又发了&#xff0c;这是什么情况&#xff1f; A1: 这种情况一般是stripe不跟你合作了或者发生了争议。 Q2:如何知道stripe回复你的邮件是人工回复还是机器人回复&#xff…

Linux基础入门---安装vmware

&#x1f600;前言 本篇博文是关于Linux基础入门和vmwarel5.5下载&#xff0c;希望你能够喜欢。 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

Merkle树(Merkle Tree):高效地验证某个数据块是否包含在数据集中

目录 Merkle树(Merkle Tree) 一、基本结构 二、构建过程 三、主要作用 四、应用领域 Merkle树(Merkle Tree) Merkle树(Merkle Tree),也被称为默克尔树或Merkle哈希树,是一种基于哈希的数据结构,主要用于验证大规模数据集的完整性和一致性。它的名字来源于其发明…

大数据技术——实战项目:广告数仓(第七部分)数仓工作流调度实操

目录 第12章 广告数仓全流程调度 12.2 新数据生成 12.2.1 广告监测日志 12.2.2 广告管理平台数据 12.3 工作流调度实操 12.3.1 DolphinScheduler集群模式 12.3.2 DolphinScheduler单机模式 第12章 广告数仓全流程调度 12.1 调度工具Dolphinscheduler DolphinScheduler…

VirtualBox上的Oracle Linux虚拟机安装Docker全流程

1.安装docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装docker仓库 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 生成docker的yum源配置到在 /etc/yum.repos.d/docker-ce.repo 3.安装D…

Linux内核分析(调度类和调度实体)

文章目录 前言一、调度类1. stop_sched_class2. dl_sched_class3. rt_sched_class4. fair_sched_class5. idle_sched_class总结 二、调度类中的操作函数三、调度实体 前言 调度是操作系统内核的一个关键职责&#xff0c;它涉及到如何合理分配CPU时间给不同的进程或线程。在Lin…

uniapp打包H5的时候 清楚缓存(不安装依赖的前提下)

问题 在写项目的时候&#xff0c;打包好一个H5 发布成功&#xff0c;后来又重新打包新的包进行更新迭代&#xff0c;但是用户手机上还是上一个版本&#xff0c;本地缓存还是没有清除。 解决问题 步骤一&#xff1a;html不缓存 在html中&#xff0c;解决缓存的方法主要是依赖…

Keepalived学习

环境准备&#xff1a;两台服务器&#xff0c;两台客户机&#xff0c;关闭火墙和selinux 在两台主机上安装ka yum install keepalived -y 开启软件 keepalived配置 进入文件 vim /etc/keepalived/keepalived.conf 修改配置 配置slave 效果 在另一台路由配置 抢占模式和非…

简洁清新个人博客网页模板演示学习

30多款个人博客、个人网站、个人主页divcss,html在线预览,个人静态页面模板(wordpress、帝国cms、typecho主题模板).这些简洁和优雅的博客网页模板,为那些想成为创建博客的个人或媒体提供灵感设计。网页模板可以记录旅游、生活方式、食品或摄影博客等网站。部分网页模板来源网友…

二叉树进阶之二叉搜索树:一切的根源

前言&#xff1a; 在学完了简单的容器与C面向对象的三大特性之后&#xff0c;我们首先接触的就是map与set两大容器&#xff0c;但是这两个容器底层实现的原理是什么呢&#xff1f;我们不而知&#xff0c;今天&#xff0c;主要来为学习map与set的底层原理而打好基础&#xff0c…

面试官:Java虚拟机是什么,Java虚拟机的内存模型是什么样子的?

哈喽&#xff01;大家好&#xff0c;我是小奇&#xff0c;一个专给面试官添堵的撑序员 小奇打算以轻松幽默的对话方式来分享一些技术&#xff0c;如果你觉得通过小奇的文章学到了东西&#xff0c;那就给小奇一个赞吧 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一…