Java—— 方法引用 : :

news2025/5/17 13:14:22

方法引用是什么

把已经存在的方法拿过来用,当做函数式接口中抽象方法的方法体

方法引用符

::

方法引用的条件

1.需要有函数式接口
2.被引用方法必须已经存在
3.被引用方法的形参和返回值需要跟抽象方法保持一致
4.被引用方法的功能要满足当前的需求

方法引用的分类

引用静态方法

格式:类名 : : 静态方法
范例: Integer : : parseInt

代码演示

集合中有以下数字,要求把他们都变成int类型
“1”,“2”,“3”,“4”,”5“ 

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

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

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

        //匿名内部类形式
        list.stream()
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s);
                    }
                })
                .forEach(s -> System.out.println(s));

        //lambda表达式
        list.stream()
                .map(s -> Integer.parseInt(s))
                .forEach(s -> System.out.println(s));

        //方法引用类型
        //map中是函数式接口
        //Integer类中的parseInt静态方法符合
        //形参和返回值与抽象方法一致
        //功能满足当前的需求
        //因此可以进行方法引用
        list.stream()
                .map(Integer::parseInt)
                .forEach(s -> System.out.println(s));
        //1
        //2
        //3
        //4
        //5
    }
}

引用成员方法

基本格式:对象 : : 成员方法 

引用本类或父类的成员方法

本类:this : : 方法名

父类:super : : 方法名

注:因为this和super处的方法不是静态的,因此引用处也不能是静态 

代码演示

设置一个界面,上面有两个按钮,对按钮利用方法引用的形式添加动作监听,要求涉及本类中的方法和父类中的方法

App类

public class App {
    public static void main(String[] args) {
        new LoginJFrame();
    }
}

LoginJFrame类继承MyJFrame

import javax.swing.*;
import java.awt.event.ActionEvent;

public class LoginJFrame extends MyJFrame {

    JButton go1;
    JButton go2;

    public LoginJFrame() {

        //初始化界面
        initFrame();

        //定义按钮组件
        go1 = new JButton("go(本类)");
        go1.setBounds(180, 80, 150, 50);
        this.getContentPane().add(go1);

        go2 = new JButton("go(父类)");
        go2.setBounds(30, 80, 150, 50);
        this.getContentPane().add(go2);

        //除了实现接口外
        //还可以利用方法引用给按钮设置动作监听
        go1.addActionListener(this::method1);//本类中的go被点击了
        go2.addActionListener(super::method2);//父类中的go被点击了
    }


    public void method1(ActionEvent e) {
        System.out.println("本类中的go被点击了");
    }

    //定义方法初始化界面
    private void initFrame() {
        //设置大小
        this.setSize(400, 300);
        //设置置顶
        this.setAlwaysOnTop(true);
        //设置居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //设置解除默认居中放置,使用坐标决定组件位置
        this.setLayout(null);
        //设置界面可视
        this.setVisible(true);
    }

}

 MyJFrame类继承JFrame

import javax.swing.*;
import java.awt.event.ActionEvent;

public class MyJFrame extends JFrame {
    public void method2(ActionEvent e) {
        System.out.println("父类中的go被点击了");
    }
}
引用其他类的成员方法

格式:其他类对象 : : 方法名

代码演示

集合中有一些名字,按照要求过滤数据
数据:"张无忌","周芷若","赵敏","张强","张三丰"
要求:只要以张开头,而且名字是3个字的 

测试类

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

public class Test {
    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));

        //lambda表达式
        list.stream()
                .filter(s -> s.startsWith("张") && s.length() == 3)
                .forEach(s -> System.out.println(s));

        //方法引用
        //需要先在别的类(StringOperation)中定义一个方法(stringJudge)
        //使得该方法
        //形参和返回值需跟抽象方法一致
        //功能满足当前的需求
        list.stream()
                .filter(StringOperation::stringJudge)
                .forEach(s -> System.out.println(s));
        //张无忌
        //张三丰
    }
}

 StringOperation 类

public class StringOperation {
    public static boolean stringJudge(String s){
        return s.startsWith("张")&&s.length()==3;
    }
}

引用构造方法

格式:类名 : : new
范例:student : : new

代码演示

集合里面存储姓名和年龄,比如:张三,23
要求:将数据封装成Student对象并收集到List集合中 

测试类 

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

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

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张三,23", "李四,24", "王五,25");

        //匿名内部类
        List<Student> newList1 = list.stream()
                .map(new Function<String, Student>() {
                    @Override
                    public Student apply(String s) {
                        return new Student(s.split(",")[0],
                                Integer.parseInt(s.split(",")[1]));
                    }
                }).collect(Collectors.toList());

        //lambda表达式
        List<Student> newList2 = list.stream()
                .map(s -> new Student(s.split(",")[0],
                        Integer.parseInt(s.split(",")[1])))
                .collect(Collectors.toList());


        //方法引用
        List<Student> newList3 = list.stream()
                .map(Student::new)
                .collect(Collectors.toList());
        System.out.println(newList3);
        //[Student{name='张三', age=23}, Student{name='李四', age=24}, Student{name='王五', age=25}]

    }
}

Student类

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    //定义一个构造方法
    //形参和返回值跟抽象方法一致
    //功能要满足当前的需求
    public Student(String s){
        this.name = s.split(",")[0];
        this.age = Integer.parseInt(s.split(",")[1]);
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

其他引用方式

使用类名引用成员方法

格式:类名 : : 成员方法
范例:String : : substring

此方法引用有不同的规则:
1.需要有函数式接口
2.被引用的方法必须已经存在
3.被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致。
4.被引用方法的功能需要满足当前的需求

抽象方法形参的详解:
第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法
在Stream流当中,第一个参数一般都表示流里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法
第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法  

弊端:

不能引用所有类中的成员方法,若抽象方法的第一个参数是A类型的,只能引用A类中的方法 

代码演示

集合里面一些字符串,要求变成大写后进行输出 

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

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

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

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

        //lambda表达式
        list.stream()
                .map(s -> s.toUpperCase())
                .forEach(s -> System.out.println(s));

        //方法引用
        list.stream()
                .map(String::toUpperCase)
                .forEach(s -> System.out.println(s));
        //AAA
        //BBB
        //CCC

    }
}
引用数组的构造方法 

格式:数据类型[ ] : : new
范例:int[ ] : : new

代码演示

集合中存储一些整数,收集到数组当中 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.IntFunction;

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

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

        //匿名内部类
        Integer[] arr1 = list.stream()
                .toArray(new IntFunction<Integer[]>() {
                    @Override
                    public Integer[] apply(int value) {
                        return new Integer[value];
                    }
                });

        //lambda表达式
        Integer[] arr2 = list.stream()
                .toArray(value -> new Integer[value]);

        //方法引用
        Integer[] arr3 = list.stream()
                .toArray(Integer[]::new);

        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr3));
        //[1, 2, 3, 4, 5]
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jmeter 安装包与界面汉化

Jmeter 安装包&#xff1a; 通过网盘分享的文件&#xff1a;CSDN-apache-jmeter-5.5 链接: https://pan.baidu.com/s/17gK98NxS19oKmkdRhGepBA?pwd1234 提取码: 1234 Jmeter界面汉化&#xff1a;

【C++】 —— 笔试刷题day_29

一、排序子序列 题目解析 一个数组的连续子序列&#xff0c;如果这个子序列是非递增或者非递减的&#xff1b;这个连续的子序列就是排序子序列。 现在给定一个数组&#xff0c;然后然我们判断这个子序列可以划分成多少个排序子序列。 例如&#xff1a;1 2 3 2 2 1 可以划分成 …

MongoTemplate 基础使用帮助手册

前言 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件&#xff0c;它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作&#xff0c;使开发者能够轻松执行 CRUD 操…

图像处理:预览并绘制图像细节

前言 因为最近在搞毕业论文的事情&#xff0c;要做出一下图像细节对比图&#xff0c;所以我这里写了两个脚本&#xff0c;一个用于框选并同时预览图像放大细节&#xff0c;可显示并返回框选图像的坐标&#xff0c;另外一个是输入框选图像的坐标并将放大的细节放置在图像中&…

力扣热题——最长相邻不相等子序列 |

题目要求从字符串数组 words 中选出一个最长的子序列&#xff0c;使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法&#xff0c;可以高效地解决该问题。具体步骤为&#xff1a;初始化一个结果列表&#xff0c;遍历 words 数组&#xff0c;检查当前字符串的…

ssti刷刷刷

[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字&#xff0c;但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码&#xff0c;这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

java+selenum专题(一)

环境搭建部署篇-> 1.简介 java版的selenium&#xff0c;介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)

[逆向工程]DebugView捕获WPS日志&#xff1f;解析未运行WPS时Shell扩展加载的原因与解决方案&#xff08;二十五&#xff09; 引言&#xff1a;一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时&#xff0c;发现日志中频繁出现 WPS 相关模块&#xff08;如 k…

ACM模式用Scanner和System.out超时的解决方案和原理

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;笔试强训 &#x1f4da;本系列文章为个人学…

Java注解详解:从入门到实战应用篇

1. 引言 Java注解&#xff08;Annotation&#xff09;是JDK 5.0引入的一种元数据机制&#xff0c;用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战&#xff0c;全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…

QML 属性动画、行为动画与预定义动画

目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1&#xff1a;属性动画应用示例2&#xff1a;行为动画实现示例3&#xff1a;预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例&#xff0c;结合属性动画(PropertyAnimatio…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驱动目录下的可以执行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

自学嵌入式 day19-数据结构 链表

二、线性表的链式存储 1.特点&#xff1a; &#xff08;1&#xff09;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上。 &#xff08;2&#xff09;所以…

东芝第3代SiC MOSFET助于降低应用中电源损耗

功率器件是管理和降低各种电子设备电能功耗以及实现碳中和社会的重要元器件。由于与比硅材料相比&#xff0c;碳化硅具有更高的电压和更低的损耗&#xff0c;因此碳化硅&#xff08;SiC&#xff09;被广泛视为下一代功率器件的材料。虽然碳化硅功率器件目前主要用于列车逆变器&…

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

为了适应 PD 分离式推理部署架构&#xff0c;百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设&#xff0c;到网络流量层面的设备配置和管理&#xff0c;再到通信组件和算子层面的优化&#xff0c;显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…

官方 Elasticsearch SQL NLPChina Elasticsearch SQL

官方的可以在kibana 控制台上进行查询&#xff1a; POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询&#xff0c;但是可以使用postman接口进行查询&#xff1a;

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…