首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

方法引用

编程知识
2024年07月21日 16:05

方法引用有什么用?

  1. 写更少代码
  2. 提高代码复用性和可维护性(尤其是团队项目中)

引用静态方法
如果你要引用的是一个静态方法,你可以使用类名::静态方法的形式。例如, 将集合中String类型数据转换成int类型
这是匿名内部类的写法:
image.png
查看parsInt源码可以发现该方法满足静态方法引用的条件.
image.png
因此可以直接引用该静态方法

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "1", "2", "3", "4", "5");

list.stream().map(Integer::parseInt).forEach(System.out::println);

引用构造方法
类名::new

什么时候要引用构造方法?

——创建对象. 举一个例子, 将String数据转化成Actor

ArrayList<String> list = new ArrayList<>();
list.add("赵丽颖-21");
list.add("杨幂-23");
list.add("胡歌-23");
list.add("霍建华-22");
list.add("唐嫣-23");

list.stream().map(new Function<String, Actor>() {

    @Override
    public Actor apply(String s) {
        return new Actor(s.split("-")[0],Integer.parseInt(s.split("-")[1]));
    }
}).forEach(System.out::println);

想想这里能否采用方法引用? 先回顾一下方法引用的条件

  1. 目标接口必须是函数式接口
  2. 引用的方法的参数列表返回类型必须与目标接口的抽象方法的参数列表和返回类型相匹配
  3. 方法体要满足所需的功能

第一个条件满足, 但是第二个条件没有现有的方法去引用, 我们可以自己在Actor里面写一个(实际开发中很可能有别人写好的), 写的时候必须遵循条件2

//"杨幂-23" --> Actor, 符合apply方法中的参数和返回类型
public Actor(String s) {
String name = s.split("-")[0];
int age = Integer.parseInt(s.split("-")[1]);
this.name = name;
this.age = age;
}
//方法引用
list.stream().map(Actor::new).forEach(System.out::println);

引用成员方法
对象::成员方法适用于该方法在其他类中
类名::成员方法适用于该方法在本类中
this::成员方法
super::成员方法

练习
image.png

public Student(String s) {
this.name = s.split(",")[0];
this.age = Integer.parseInt(s.split(",")[1]);
}
//1.创建一个String类型的集合
ArrayList<String> list = new ArrayList<>();
//2.向集合中添加元素
Collections.addAll(list,"张三,21","李四,22","王五,23","赵六,21","田七,23");
//3.将集合元素类型转换成Student, 再收集到数组中
Student[] array = list.stream().map(Student::new).toArray(Student[]::new);
System.out.println(Arrays.toString(array));

image.png

//1.创建Student对象集合
ArrayList<Student> list = new ArrayList<>();
//2.添加学生对象
list.add(new Student("张三", 20));
list.add(new Student("李四", 21));
list.add(new Student("王五", 22));
//3.转化成Stream流, 只获取学生姓名, 再放入数组
String[] array = list.stream().map(new Function<Student, String>() {
    @Override
    public String apply(Student student) {
        return student.getName();
    }
}).toArray(String[]::new);
System.out.println(Arrays.toString(array));

请问上面代码的map能否使用方法引用?

你可能会回答不行, 因为apply需要接收一个Student类型的参数, 但是getName()没有任何参数, 不符合条件.
实际上, getName()方法接收了一个隐含的参数this, getName()方法体内的name字段实际上是通过this.name访问的, 即使你没有在方法签名中声明它. 当你在Student对象上调用getName()时, this参数被自动设置为student对象.因此我们可以将上面的代码修改为

 String[] array = list.stream().map(Student::getName).toArray(String[]::new);

为什么要用类名去引用getName?而不是对象

Student::getName能够被应用到流中的任何Student对象. 如果你使用的是对象引用(假设myStudent是一个Student对象),如myStudent::getName,这将不会工作,因为myStudent可能不一定是流中的元素,而且这种方法引用将只绑定到myStudent这个特定对象,而不是流中的任意Student对象。
image.png
这与第二个练习类似, 不同之处在于Studnet --> "姓名-年龄", 只需要重写Student类中的toString()方法, 通过Student::toString进行引用即可.

From:https://www.cnblogs.com/seeriop/p/18314674
本文地址: http://www.shuzixingkong.net/article/252
0评论
提交 加载更多评论
其他文章 ComfyUI进阶:Comfyroll插件 (六)
ComfyUI进阶:Comfyroll插件 (六)前言:学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建方面进行深入探索。C
ComfyUI进阶:Comfyroll插件 (六) ComfyUI进阶:Comfyroll插件 (六) ComfyUI进阶:Comfyroll插件 (六)
试试这个工作流引擎吧,还有个简洁美观的流程设计器
ruoyi-flow若依工作流引擎设计器一个简洁轻量的工作流引擎。 java工作流引擎,真正的国产工作流引擎,前后端代码完整且还拥有一个简洁美观的流程设计器。 前端vue后端Java的。 功能特点 1、使用json存储流程模板 2、支持驳回、拿回等 3、支持状态配置、权限配置 4、支持条件分支 流程
试试这个工作流引擎吧,还有个简洁美观的流程设计器 试试这个工作流引擎吧,还有个简洁美观的流程设计器 试试这个工作流引擎吧,还有个简洁美观的流程设计器
设计模式之观察者模式(学习笔记)
定义 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。这种模式用于实现对象之间的解耦,使得一个对象的变化可以通知并更新多个依赖对象,而无需直接引用它们。 为什么使用观察者模式? 解耦 观察者模式将观察者(Observ
深入探究 Golang 反射:功能与原理及应用
Go 出于通用性的考量,提供了反射这一功能。借助反射功能,我们可以实现通用性更强的函数,传入任意的参数,在函数内通过反射动态调用参数对象的方法并访问它的属性。本文将深入探讨Golang反射包reflect的功能和原理。同时,我们学习某种东西,一方面是为了实践运用,另一方面则是出于功利性面试的目的。所
深入探究 Golang 反射:功能与原理及应用 深入探究 Golang 反射:功能与原理及应用 深入探究 Golang 反射:功能与原理及应用
一文全懂:独立冗余磁盘阵列(RAID)
本文介绍了独立冗余磁盘阵列RAID的四种常见模式:RAID0、RAID1、RAID5、RAID10,并且使用mdadm命令在liux系统上如何创建磁盘阵列的详细步骤。
一文全懂:独立冗余磁盘阵列(RAID) 一文全懂:独立冗余磁盘阵列(RAID) 一文全懂:独立冗余磁盘阵列(RAID)
NSSCTF———Web(sql注入)
[LitCTF 2023]这是什么?SQL !注一下 ! [SWPUCTF 2022 新生赛]ez_sql [GXYCTF 2019]BabySqli 点击右下角文章可跳转 [LitCTF 2023]这是什么?SQL !注一下 ! 首先我们打开靶场查看信息,提示了闭合方式为id = (((((())
NSSCTF———Web(sql注入) NSSCTF———Web(sql注入) NSSCTF———Web(sql注入)
LLM-01 大模型 本地部署运行 ChatGLM2-6B-INT4(6GB) 简单上手 环境配置 单机单卡多卡 2070Super8GBx2 打怪升级!
超详细从0-1部署ChatGLM2-6B-INT4(6GB),双卡 2070 Super 8GB * 2,后续一步一步对大模型进行微调测试!
LLM-01 大模型 本地部署运行 ChatGLM2-6B-INT4(6GB) 简单上手 环境配置 单机单卡多卡 2070Super8GBx2 打怪升级! LLM-01 大模型 本地部署运行 ChatGLM2-6B-INT4(6GB) 简单上手 环境配置 单机单卡多卡 2070Super8GBx2 打怪升级! LLM-01 大模型 本地部署运行 ChatGLM2-6B-INT4(6GB) 简单上手 环境配置 单机单卡多卡 2070Super8GBx2 打怪升级!
Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)
PS:要转载请注明出处,本人版权所有。 PS: 这个只是基于《我自己》的理解, 如果和你的原则及想法相冲突,请谅解,勿喷。 环境说明 无 前言 只要装过各种系统的人都或多或少会接触到UEFI或者BIOS这样的概念。本文也不会对这些概念进行详解,本文主要把这些概念串起来,并引入MOK(Machine
Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)