首页 > 其他分享 >方法引用

方法引用

时间:2024-07-21 17:08:00浏览次数:7  
标签:String list 引用 Student new 方法

方法引用有什么用?

  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进行引用即可.

标签:String,list,引用,Student,new,方法
From: https://www.cnblogs.com/seeriop/p/18314674

相关文章

  • JAVA中的方法
    什么是方法方法就是函数,由代码片段构成,用于实现特定的功能。方法的定义及调用方法包括两个部分:方法头和方法体。修饰符返回值类型方法名(参数类型参数名){​ 方法体​ return返回值;}publicstaticvoidmain(){max(10,20);}publicstaticintmax(inta,int......
  • 串口通信操作方法及三种实现方式(基于百问网DshanMCU-F103)
    UART全称为通用异步收发器,英文全称(UniversalAsynchronousReceiver/Transmitter)。是一种串行、异步、全双工的通信协议。一、使用方法UART首先将接收到的并行数据转换成串行数据来传输,消息帧从一个低位起始位开始,后面是5-8个数据位,一个可用的奇偶位和一个或几个高低停止位......
  • 爬虫爬取网页的信息与图片的方法
    爬虫爬取网页的信息与图片的方法爬取人物信息importrequestshead={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/126.0.0.0Safari/537.36Edg/126.0.0.0"}#这是get请求带参数的模式defget......
  • Android Studio项目中的重复类、动态版本控制及其他优化方法
    本文介绍在Android开发过程中,我们常常会遇到一些棘手的问题,如重复类冲突、动态版本控制及依赖打包等。本文将介绍如何解决这些问题,并提供一些有用的优化方法。1.解决重复类冲突问题在引入多个JAR包或AAR包时,可能会遇到类重复的问题,导致编译失败。这里提供了两种解决方......
  • 嵌入式单片机STM32中堆栈使用方法
       学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。    对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区:栈区(stack......
  • 去趋势波动分析方法-捕捉时间序列数据在不同尺度上的变化特性
    前言近年来,降水过程中的分形行为和长期相关性成为了一个活跃的研究领域。这些研究表明,降水数据中存在分形行为,但分形理论在实际应用中仍然不够充分。传统方法的局限性:由于降水过程的非平稳性,传统的线性方法(如自相关函数分析或谱分析)在检测时间序列的这些属性时不可靠。非......
  • 将 pandas 数据框中的列移动到大型数据框中的最后一列的最佳方法
    我有一个包含100多列的pandas数据框。例如,在以下df:df['A','B','C','D','E','date','G','H','F','I']如何将日期移动到最后一列?假设数据帧很大并且我无法手动写入所有列名称。以下是将pandas数据框中的列移动到大型数据框......
  • 简单的数论函数及其求和方法
    目录数论函数记号与约定线性筛两例变量分离关于\(\mu^2(i)\)狄利克雷卷积狄利克雷卷积基本性质几个简单的狄利克雷卷积狄利克雷卷积的求法(特别鸣谢:pp_orange)当\(f,g\)是普通函数时当\(f\)为积性函数时当\(f,g\)为积性函数时杜教筛前置:\(\sum\limits_{i=1}^{n}i^k......
  • SpringBoot 测试Control接口方法
    在SpringBoot中对Controller接口方法进行测试是保障应用稳定性和正确性的关键步骤: 单元测试: -选择合适的测试框架:常用的有JUnit,它提供了丰富的断言方法和测试运行机制。结合Mockito可以方便地创建模拟对象和设置预期行为。-针对业务逻辑:重点测试Controller......
  • 在 PowerShell 中,可以编写脚本来检测本地加载和远程加载的情况。这通常涉及到检查计算
    在PowerShell中,可以编写脚本来检测本地加载和远程加载的情况。这通常涉及到检查计算机上的特定服务或应用程序的状态或配置。以下是一些示例脚本和方法,可以用来实现这些检测:检测本地加载示例:检查本地服务的运行状态powershellCopyCode#检查本地服务状态$serviceName="M......