首页 > 编程语言 >java-----方法引用

java-----方法引用

时间:2024-09-19 19:21:34浏览次数:15  
标签:java String list ----- 引用 new 方法 public

方法引用:把已有的方法拿过来用,当做函数式接口中抽象方法的方法体

方法引用符是::

注意:

        1.引用处必须是函数式接口

        2.被引用的方法已经存在

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

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

方法引用的分类:

一、引用静态方法

        格式:类名::静态方法

        例子:Integer::parseInt

二、引用成员方法

        格式:对象::成员方法 

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

        ②本类:this::方法名

        ③父类:super::方法名

三、引用构造方法

①其他类对象::方法名

public class demo3 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        Collections.addAll(list,"张三丰","张思","李书记","账务","张喷");
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张")&&s.length()==3;
            }
        }).forEach(s->System.out.println(s));
        //可以把上面转为方法引用
        //filter里的方法是函数式接口的 满足条件1
        //引用的方法已经在new Test中创建 满足条件2
        //被引用方法的形参和返回值需要跟抽象方法一致 自定义设置 满足3
        //被引用方法功能都是为了筛选姓张的和姓名长度为3
        list.stream().filter(new Tes()::tess).forEach(s->System.out.println(s));
    }
}


//下面是Tes自定义的方法
package functionDemo;

public class Tes {
    public boolean tess(String s){
        return s.startsWith("张")&&s.length()==3;
    }
}

②本类:this::方法名③父类:super::方法名

注意:不能写在静态方法中,静态方法中没有this和super

可以看到以下情况 可以用this调用 我们这里就假设点击login这个按钮能够更改验证码,当然实际业务这种不可能,只是为了演示这个方法复用的例子,这中做法可以提高代码的独立性

login.addActionListener(this::updateRightCode);

public void updateRightCode(ActionEvent e){
        //获取正确的验证码
        if(login==e.getSource()){
            String codeStr = CodeUtil.getCode();
            rightCode.setText(codeStr);
        }

    }
super就是继承中使用,不再演示

 方法引用构造方法

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
import java.util.stream.Collectors;

public class demo5 {
    public static void main(String[] args) {
        ArrayList<String> list1=new ArrayList<>();
        Collections.addAll(list1,"张无忌-13","周芷若-14","赵敏-15","张强-16","张三丰-15");

        list1.stream().map(new Function<String,Student>() {
            @Override
            public Student apply(String s) {
                return new Student(s.split("-")[0],Integer.parseInt(s.split("-")[1]));
            }
        }).forEach(s->System.out.println(s));

        System.out.println("方法引用构造方法:");
        list1.stream().map(Student::new).forEach(s->System.out.println(s));
    }
}


Student类中的构造方法
public Student(String s){
        this.name=s.split(",")[0];
        this.age=Integer.parseInt(s.split("-")[1]);
}

//方法引用满足
1.map方法里的形参满足函数式接口
2.引用的方法已经存在,生成了Student构造方法
3.参数都是String s,返回值是Student对象
4.目的都是转为Student对象

四、其它调用方式

        1.使用类名引用成员方法

package functionDemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;
import java.util.function.Function;

public class demo6 {
    public static void main(String[] args) {

        ArrayList<String> list=new ArrayList<>();
        Collections.addAll(list,"aaa","bbb","ccc","ddd");


        list.stream().map(new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s.toUpperCase();
            }
        }).forEach(s->System.out.println(s));

        list.stream().map(String::toUpperCase).forEach(s->System.out.println(s));

    }
}

可以看到其它类调用成员方法时跟我们上面看到的方法引用的规则似乎不太一样

这里方法规则不太一样:

1. 需要有函数式接口

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

3.被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致

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

可以看到,第三点与之前不同

让我们来看下抽象方法形参的详解:

第一个参数:表示被引用方法的调用者,决定了可以引用那些类中的方法,在Stream流中,第一个参数一般都表示流里面的每一个数据,假设流里面的数据是字符串,那么使用这种方法引用,只能引用String这个类中的方法

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

list.stream().map(new Function<String, String>() {
    @Override
    public String apply(String s) { //只有一个参数,所以被引用的方法是无参的构造方法,且流里的数据是String类型的,只能引用String类里面的方法
        return s.toUpperCase();
    }
}).forEach(s->System.out.println(s));

public String toUpperCase() {
    return toUpperCase(Locale.getDefault());
}//返回值类型都是String

        2.引用数组构造方法

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


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.IntFunction;
public class demo7 {
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5);
        Integer []arr=list.stream().toArray(new IntFunction<Integer[]>() {
            @Override
            public Integer[] apply(int value) {
                return new Integer[value];
            }
        });

        Integer []arr2=list.stream().toArray(Integer[]::new);
        System.out.println(Arrays.toString(arr));
    }
}

标签:java,String,list,-----,引用,new,方法,public
From: https://blog.csdn.net/qq_44766305/article/details/142361442

相关文章

  • ORA-01440: column to be modified must be empty (修改列类型时报错:要修改的列必须为
    创建新列:在表中添加一个新的列,然后将数据迁移到新列,最后删除旧列并重命名新列。ALTERTABLE"MESDB"."NC_WORKORDER"ADD("RECEIPT_QUANTITY_NEW"NUMBER(10,6));​--将数据迁移到新列UPDATE"MESDB"."NC_WORKORDER"SET"RECEIPT_QUANTITY_NEW"="RE......
  • JavaScript在数据可视化领域的探索与实践
    目录引言JavaScript可视化库概览D3.js基础入门1.引入D3.js2.绘制简单的条形图3.添加轴交互性与动画实际应用场景结论引言在数据驱动决策日益重要的今天,数据可视化成为连接数据与洞察的桥梁。JavaScript,作为前端开发的主力军,凭借其灵活性和丰富的库支持,在数据......
  • Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?
    文章汇总本文的作者针对了提示学习的结构设计进行了分析,发现了一些规律:1)固定的类名令牌为模型的优化提供了强正则化,减少了由噪声样本引起的梯度。2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大的先验知识。3)CLIP的噪声零样本预测......
  • java计算机毕业设计少儿英语在线学习平台APP(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全球化进程的加速和互联网技术的飞速发展,英语作为国际交流的重要工具,其教育需求在少儿群体中日益凸显。传统线下英语教育模式受限于时间、地点及......
  • JavaSE——多线程基础
    概述        现代操作系统(Windows,macOS,Linux)都可以执行多任务。多任务就是同时允许多个任务。例如:播放音乐的同时,浏览器可以进行文件下载,同时可以进行QQ消息的收发。    CPU执行代码都是一条一条顺序执行的,但是,即使是单核CPU,也可以同时运行多个任务。因为操......
  • Java·Swing窗口登录源码
    文章目录概要整体架构流程技术名词解释技术细节小结概要Java Swing是Java基础类库的一部分,主要用于开发图形用户界面(GUI)程序整体架构流程1.准备好mysql数据库也可以使用云端数据库2.一个灵活的脑子3.IDEA技术名词解释一、javax.swing.JOption......
  • Java中异常类处理机制的学习
    异常处理机制目录异常处理机制抛出异常捕获异常异常传播抛出异常当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。throw与throws的用法throws:通常被用在......
  • LLM学习笔记-长度外推技术
    长度外推为在不需要对模型进行额外训练的情况下,模型可以处理更长的序列。本篇文章主要介绍目前大模型用到的一些长度外推技术,包括以RoPE为基础进行位置插值、NTK-aware、动态NTK、NTK-by-parts和YaRN。关于RoPE,可参见我的上一篇博客LLM学习笔记-位置编码篇位置插值回想一下Tran......
  • 论文阅读-ACL2024-Agent概览
    template论文名称:作者:所属单位:关键词:代码链接:内容概述:ChatDev:CommunicativeAgentsforSoftwareDevelopment作者:ChenQian⋆WeiLiu⋆HongzhangLiu♠NuoChen⋆YufanDang⋆JiahaoLi⋆ChengYang♣WeizeChen⋆YushengSu⋆XinCong⋆JuyuanXu⋆Daha......
  • kube-vip搭建k8s1.30.5高可用集群
    实验环境机器五台系统:ubuntu24.04cat/etc/hosts192.168.0.11jichao11k8s-master01192.168.0.12jichao12k8s-master02192.168.0.13jichao13k8s-master03192.168.0.14jichao14k8s-worker01192.168.0.15jichao15k8s-worker02192.168.0.200lb.kub......