[java进阶]——方法引用改写Lambda表达式

news2024/11/26 12:00:51

🌈键盘敲烂,年薪30万🌈

目录

📕概念介绍:

⭐方法引用的前提条件:

1.引用静态方法

2.引用构造方法

①类的构造:

②数组的构造:

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

①本类:

①父类:

4.引用其他类的方法

5.特定类的方法引用

🐒总结


📕概念介绍:

方法引用改写Lambda表达式可简化代码书写,方法引用就是调用已经拥有的方法,学习方法引用是必要的,在java的原码中你会经常看到它,在以后mybatis-plus的学习中会大量使用方法引用。

方法引用的前提条件:

  • 拥有函数式接口
  • 存在引用方法
  • 引用方法同抽象方法的作用相同
  • 引用的方法的形参和返回值类型要与抽象方法保持一致

1.引用静态方法

格式:类名::方法名

代码实现:

    //将集合中的元素转化为int类型并打印     
    List<String> list = new ArrayList<>();
    Collections.addAll(list, "2", "5", "4", "10");
    //Lambda方法
    list.stream().map(new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            return Integer.parseInt(s);
        }
    }).forEach(System.out::println);*/
    //方法引用
    list.stream().map(Integer::parseInt).forEach(System.out::print);

2.引用构造方法

①类的构造:

    格式:类名::new

    注意:类里面要有对应的构造方法(参数名与抽象方法保持一致)

代码实现:

        //将集合里面的字符串封装称user对象
        //原始写法
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌,18", "小昭,19");
        /*List<User> collect = list.stream().map(new Function<String, User>() {
            @Override
            public User apply(String s) {
                String[] split = s.split(",");
                return new User(split[0], Integer.parseInt(split[1]));
            }
        }).collect(Collectors.toList());
        System.out.println(collect);*/
        //引用构造方法
        //类名::new
        List<User> newlist = list.stream().map(User::new).collect(Collectors.toList());
②数组的构造:

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

代码实现:

        //数组的构造方法
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4);
        //原始方法
        Integer[] array = list.stream().toArray(new IntFunction<Integer[]>() {
            @Override
            public Integer[] apply(int value) {
                return new Integer[value];
            }
        });
        //方法引用
        Integer[] array1 = list.stream().toArray(Integer[]::new);

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

①本类:

    格式:this::方法名 (前提:非静态)

    注意:被引用方法一定不要是静态的,因为静态里面没有this和super关键字

代码实现:

    //升序排序
    public void testmethod1(){
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);
        // 引用本类中非静态的 this::方法名
        list.stream().sorted(this::method1).forEach(System.out::print);
    }
    public int method1(int o1, int o2){
        return o2 - o1;
    }
①父类:

    格式:super::方法名(前提:非静态)

代码实现:

同上只是将this改为了super

4.引用其他类的方法

格式:对象名::方法名

    public static void main(String[] args) {
        //将集合中的数据封装成User对象
        //引用其他类型的方法
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌,18", "小昭,19");
        List<User> newlist = list.stream().map(new Utils()::method).collect(Collectors.toList());
        System.out.println(newlist);
    }

5.特定类的方法引用

格式:类::方法名

注意:抽象方法的形参从第二个开始到最后与引用方法保持一致,第一个形参用于指明是什么类

代码演示:

        // 将字母转为大写
        //原始方法
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "aaa", "bbb", "ccc");
        List<String> collect = list.stream().map(new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s.toUpperCase();
            }
        }).collect(Collectors.toList());
        System.out.println(collect);
        //方法引用
        //类名::方法名
        //局限:只能引用抽象方法中第一个参数类型里面的方法
        //就像这里只能引用string里面的方法
        //注意 被引用方法的第二个到最后一个形参要与抽象方法保持一致
        List<String> newlist = list.stream().map(String::toUpperCase).collect(Collectors.toList());

🐒总结

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

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

相关文章

深入理解ClickHouse跳数索引

一、跳数索引​ 影响ClickHouse查询性能的因素很多。在大多数场景中&#xff0c;关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此&#xff0c;选择适用于最常见查询模式的主键对于表的设计至关重要。 然而&#xff0c;无论如何仔细地调优主键&#xff…

深度图(Depth Map)

文章目录 深度图深度图是什么深度图的获取方式激光雷达或结构光等传感器的方法激光雷达RGB-D相机 双目或多目相机的视差信息计算深度采用深度学习模型估计深度 深度图的应用场景扩展阅读 深度图 深度图是什么 深度图&#xff08;depth map&#xff09;是一种灰度图像&#xf…

Windows 10 启用 Hyper-V

文章目录 Windows 10 启用 Hyper-V打开控制面板打开任务管理器 Windows 10 启用 Hyper-V 打开控制面板 打开程序和功能 启用或关闭Windows功能 立即重启 打开任务管理器 出现下图&#xff0c;代表已启用

医院pacs系统是什么?

医院pacs系统是什么&#xff1f; PACS系统的概念已从原来将数字化的医学影像通过网络传送到连接在网络上的影像显示工作站上作一般显示和进行数字化存储&#xff0c;发展成为以数字化诊断&#xff08;无纸化、无胶片化&#xff09;为核心的整个影像管理过程&#xff0c;包括&a…

2023/11/7 JAVA学习

ctrl alt t自动重写

Selenium爬取内容并存储至MySQL数据库

前面我通过一篇文章讲述了如何爬取博客摘要等信息。通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进行数据处理和数据分析的。这篇文章主要讲述通过Selenium爬取我的个人博客信息,然后存储在数据库MySQL中,以便对数据进行分析,比如分析哪个时间段…

MAC设备(M1)环境下编译安装openCV for Java

最近发现一个需求&#xff0c;可以用openCV来实现&#xff0c;碰巧又新买了mac笔记本&#xff0c;就打算利用业余时间安装下openCV。这里将主要步骤记录下&#xff0c;希望能帮助有需要的人。 1、准备编译环境 #查询编译opencv相关依赖 brew info opencv查询结果如下图所示&a…

css排版—— 一篇优雅的文章(中英文) vs 聊天框的特别排版

文章 <div class"contentBox"><p>这是一篇范文——仅供测试使用</p><p>With the coming of national day, I have a one week holiday. I reallyexpect to it, because it want to have a short trip during these days. Iwill travel to Ji…

结合双向LSTM和注意力机制的DQN-CE算法船舶能量调度

Title:Ship Energy Scheduling with DQN-CE Algorithm Combining Bi-directional LSTM and Attention Mechanism 【Applied Energy】结合双向LSTM和注意力机制的DQN-CE算法船舶能量调度(中科院1区Top,IF 11.2) 具体实现方法可以参考原文:论文地址 欢迎大家引用和交流,具体…

如何在在线Excel文档中规范单元格输入

在日常的工作中&#xff0c;我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能&#xff0c;它可以帮助用户规范单元格的输入&#xff0c;从而提…

学习日记01——JS基础01

JavaScrip简单介绍 是前端脚本语音&#xff0c;快速入门js基本语法&#xff0c;本篇文章涉及到JavaScrip基础的变量定义&#xff0c;数据类型和基础的流程控制语句。 使用到的工具 1&#xff0c;vscode 2&#xff0c;chrome浏览器 js的变量定义 准备工作&#xff08;简单的h…

【论文阅读】Progressive Spatio-Temporal Prototype Matching for Text-Video Retrieval

资料链接 论文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Li_Progressive_Spatio-Temporal_Prototype_Matching_for_Text-Video_Retrieval_ICCV_2023_paper.pdf 代码链接&#xff1a;https://github.com/imccretrieval/prost 背景与动机 文章发…

HTML使用canvas绘制海报(网络图片)

生成前&#xff1a; 生成后&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>媒体参会嘉宾邀请函生成链接</title><link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/vant2.10…

矩阵键盘独立接口设计(Keil+Proteus)

前言 实验&#xff1a;通过4*4的矩阵键盘&#xff0c;按下某个按钮之后会在数码管上面显示对应的键号。&#xff08;0~F&#xff09; 基础操作参考这篇博客&#xff1a; LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;-CSDN博客https://blog.csdn.net/w…

maven 上传本地jar包到nexus

maven上传命令 mvn deploy:deploy-file -DgroupIdcom.microsoft.sqlserver -DartifactIdsqljdbc4 -Dversion4.0 -Dpackagingjar -DfileC:\java\top-sdk-java-1.0.1-lib\lib\bcprov-jdk16-1.46.jar -Durlhttp://ip:port/repository/maven-releases/ -DrepositoryIdsnapshot…

一个Linux自动备份脚本的示例

一个简单的Linux自动备份脚本的示例&#xff0c;根据需要进行自定义&#xff1a; 请确保按照您的需求修改source_dir和backup_dir为要备份的源目录和备份目录的路径。此脚本使用tar命令创建一个以当前日期命名的压缩备份文件&#xff0c;并在备份完成后检查是否成功。此外&…

vite基础学习笔记:13.Dialog 对话框 (用户注册与登录)

说明&#xff1a;自学做的笔记和记录&#xff0c;如有错误请指正 1. Dialog 对话框组件 目标效果&#xff1a;点击“登录/注册”&#xff0c;弹框 &#xff08;1&#xff09;创建全局组件&#xff0c;在官网中查询代码粘贴 &#xff08;2&#xff09; 注册和使用全局组件 &a…

Android ConstraintLayout

0dp 充满约束 to左侧是控件本身,to右边是约束条件 例如: app:layout_constraintBottom_toBottomOf"id/image_1" app:layout_constraintTop_toBottomOf"id/image_1" 指定权重: app:layout_constraintHorizontal_weight"" app:layout_constra…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…

cygwin编译redis、nssm配置redis服务

一、总结 本文尝试了redis-7.2.1、redis-7.2、redis-7.0.12、redis-6.2.13&#xff0c;其中redis-7.0.12、redis-6.2.13下载下来后&#xff0c;没有修改redis项目的任何代码&#xff0c;直接在解压后的根目录下执行make命令就可以成功&#xff0c; 结果总结如下&#xff1a; r…