JAVASE进阶:高级写法——方法引用(Mybatis-Plus必学前置知识)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:JAVASE进阶:一文精通Stream流+函数式编程
📚订阅专栏:JAVASE进阶
希望文章对你们有所帮助

相信大家都会用mybatis-plus,但可能只会用其中的一些简单增删改查,想要将mybatis-plus学深入,需要学会方法引用,这是一个很重要的内容。

高级写法——方法引用(Mybatis-Plus必学前置知识)

  • 概述
  • 引用静态方法
  • 引用成员方法
    • 引用其他类的成员方法
    • 引用本类和父类的成员方法
  • 引用构造方法
  • 其他调用方式
    • 使用类名引用成员方法
    • 引用数组的构造方法

概述

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

对于数组排序,可以使用匿名内部类,也可以利用lambda表达式来简化,同时还可以使用方法引用Arrays.sort(arr, 比较规则),需要满足以下要求:

1、引用出处必须是函数式接口
2、被引用的方法必须存在
3、被引用方法的形参和返回值需要跟抽象方法一致
4、被引用的方法的功能要满足当前需求,这个方法应该要与匿名内部类一致(形参类型、返回值)

这里直接贴一个例子:

public class ArrayTest {
    public static void main(String[] args) {
        Integer[] arr = {3, 5, 4, 1, 6, 2};
        Arrays.sort(arr, ArrayTest::subtraction);
        System.out.println(Arrays.toString(arr));
    }
    public static int subtraction(int num1, int num2){
        return num2 - num1;
    }
}

其中,::表示方法引用符

引用静态方法

格式为类名::静态方法,例如Integer::parseInt
做一个小demo,把List中的"1",“2”,“3”,“4”,"5"转化为int类型:

public class ArrayTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "1","2","3","4","5");
        List<Integer> list1 = list.stream().map(Integer::parseInt).collect(Collectors.toList());
        System.out.println(list1);
    }
}

可以看到,Integer::parseInt在这里比lambda表达式的s->Integer.parseInt(s)还要便捷,但需要保证Integer类中的parseInt确实是传入String转化为int类型的,即可直接使用。

引用成员方法

引用成员方法的基本格式为对象::成员方法,这个对象的来源不同,方法的格式具体写法也会有一些区别:
1、其他类:其他类对象::方法名
2、本类:this::方法名
3、父类:super::方法名

引用其他类的成员方法

将集合中的的名字进行过滤,留下以"张"开头的,并且名字是3个字的。

可以先写匿名内部类:

	list.stream().filter(new Predicate<String>() {
        @Override
        public boolean test(String s) {
            return s.length()==3&&s.startsWith("张");
        }
    }).forEach(s-> System.out.println(s));

观察这个匿名内部类重写方法中的形参为String类型,返回值为boolean类型的,但是java并没专门提供这样的方法,所以不能直接使用,因此我们可以新建一个类:

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

现在就可以引用这个成员方法了,但是需要注意,这里的方法不是静态方法,所以需要用对象调用成员方法,不是直接用类来调用的,需要创建这个对象出来:

list.stream().filter(new StringOperation()::stringJudge).forEach(s-> System.out.println(s));

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

因为是在本类的,所以利用this关键字也是可以的,但是必须保证引用出不能是静态方法!因为在静态方法中,是不可能有this和super的。
引用本类:this::方法名
引用父类:super::方法名

引用构造方法

引用构造方法就是为了创建这个类的对象,其格式为类型::new,比如Student::new,做一个练习:在集合中存储姓名和年龄,将数据封装为Student对象并收集到List集合中。

先试用匿名内部类编写代码:

public class demo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌,15", "吗喽,13", "张三丰,100", "张良,35");
        List<Student> newList = 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());
        System.out.println(newList);
    }
}

而如果要使用方法引用,必须要满足那4点要求,然而在这里却不满足被引用方法的形参和返回值,需要跟抽象方法的形参返回值保持一致的要求,这里的形参是String,返回值为Student类型,所以Student中需要专门有一个形参为String类型的构造方法,这种构造方式和一般的方式还是有点不一样的:
在这里插入图片描述
这样子,使用引用方法就不会再报错:

List<Student> newList = list.stream().map(Student::new).collect(Collectors.toList());

其他调用方式

使用类名引用成员方法

格式为类名::成员方法,例如String::substring,如下例中对集合中的一些字符串变成大写并输出:

	public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "aaa", "bbb", "ccc");
        List<String> newList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
        System.out.println(newList);
    }

引用数组的构造方法

格式为数据类型[]::new,例如int[]::new,做一个练习:集合中存储一些整数,收集到数组中去。
在这里肯定是只能使用toArray方法了,这种方法感觉用的还是有点少的,但是也肯定要掌握以下。
首先编写一下匿名内部类,这一块要是基础不是特别扎实的话也还是要捣鼓一会的:

	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) {
                //System.out.println(value);
                return new Integer[value];
            }
        });
        System.out.println(Arrays.toString(arr));
    }

主要就是要注意,IntFunction中的泛型装的是要处理的数据类型,这里放了一堆的整数可以当作是Integer[],注意不能写int不然会报错。
apply中的value不是指元素值,而是这个数组的长度,因此需要返回Integer[value]。

因此转换为方法引用的代码如下所示,由于上面的形参必须是Integer[]类型的,所以这边也不能用int[]

	public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);
        Integer[] arr = list.stream().toArray(Integer[]::new);
        System.out.println(Arrays.toString(arr));
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud--Eureka注册中心服务搭建注册以及服务发现

注意springboot以及springcloud版本&#xff0c;可能有莫名其妙的错误&#xff0c;这里使用的是springboot-2.6.13&#xff0c;springcloud-2021.0.5 一&#xff0c;Eureka-Server搭建&#xff1a; 1.创建项目&#xff1a;引入依赖 <dependency><groupId>org.sp…

MyBatis 分页插件 PageHelper-Dazer007

文章目录 MyBatis 分页插件 PageHelper-Dazer0071、使用方式1.1 原始PageHelper1.2 ruoyi框架封装PageHelper1.3 MyBaits-Plus自带分页&#xff0c;无需PageHeler 2、作用原理3、数据方言实现3.1、MySqlDialect3.2、OracleDialect3.3、SqlServer2012Dialect 3、数据方言实现 My…

【Spring】Spring事务和事务传播机制

文章目录 什么是事务事务的操作Spring 中事务的实现Spring编程式事务Spring 声明式事务 TransactionalTransactional作用Transactional 详解rollbackFor事务隔离级别Spring 事务隔离级别Spring 事务传播机制 什么是事务 事务&#xff08;Transaction&#xff09;是一个程序中一…

嵌入式软件的设计模式与方法

思想有多远&#xff0c;我们就能走多远 4、状态与工作流类设计模式 4.1 状态与事件 行为随条件变化而改变&#xff0c;这里状态切换的模式也称为状态机。有限状态机 (Finite State Machine&#xff0c;FSM) 是由3 个主要元素组成的有向图: 状态、转换和动作。 状态是系统或者…

jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

python常用的深度学习框架

目录 一&#xff1a;介绍 二&#xff1a;使用 Python中有几个非常受欢迎的深度学习框架&#xff0c;它们提供了构建和训练神经网络所需的各种工具和库。以下是一些最常用的Python深度学习框架&#xff1a; 一&#xff1a;介绍 TensorFlow&#xff1a;由Google开发的TensorF…

LeetCode-第171题-Excel表的序列号

1.题目描述 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 2.样例描述 3.思路描述 遍历时将每个字母与 A 做减法&…

python 动态数据 展示 ,数据是由51单片机发送过来的,温度传感器。

import tkinter as tk import randomimport seriallis[] for i in range(50):lis.append(i1) # 打开串行端口 ser serial.Serial(COM3, 9600) # 9600为波特率&#xff0c;根据实际情况进行调整# 初始化数据 lis [random.randint(15, 35) for _ in range(50)]def update_data…

jenkins 发布远程服务器并部署项目

安装参考另一个文章 配置maven 和 jdk 和 git 注意jdk的安装目录&#xff0c;是jenkins 安装所在服务器的jdk目录 注意maven的目录 是jenkins 安装所在服务器的maven目录 注意git的目录 是jenkins 安装所在服务器的 git 目录 安装 Publish Over SSH 插件 配置远程服务器 创…

信号系统之线性系统详解

1 线性系统 信号描述了一个参数如何随另一个参数变化。例如&#xff0c;电子电路中的电压随时间变化&#xff0c;或图像中随距离变化的亮度。系统是响应输入信号而产生输出信号的任何过程。如图中的框图所示。 有几个规则用于命名信号&#xff1a; 连续信号使用圆括号&#x…

Python tkinter (15) —— PhotoImage

本文主要介绍Python tkinter PhotoImage图像应用及示例。 系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按…

22.HarmonyOS App(JAVA)位置布局PositionLayout使用方法

不常用 在PositionLayout中&#xff0c;子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角&#xff1b;当向下或向右移动时&#xff0c;坐标值变大&#xff1b;允许组件之间互相重叠 布局方式 PositionLayout以坐标的形式控制组件的显示位置&#xff0c;允许组件相…

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…

【MATLAB源码-第131期】基于matlab的淘金优化算法(GRO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 淘金优化算法&#xff08;GoldRush Optimizer&#xff0c;简称GRO&#xff09;是一种启发式优化算法&#xff0c;它受到淘金过程的启发。在淘金过程中&#xff0c;淘金者在河流或矿区中寻找金矿&#xff0c;通过筛选沙砾来寻…

Django通过Json配置文件分配多个定时任务

def load_config():with open("rule.json", rb)as f:config json.load(f)return configdef job(task_name, config, time_interval):# ... 通过task_name判断进行操作if task_name get_data_times:passdef main():config load_config()for task_name, task_value…

SpringBoot多模块项目proguard混淆

SpringBoot多模块项目proguard混淆 前言整活项目目录混淆后的效果图混淆配置混淆配置规则keep相关通配符和关键字keep说明常见问题解决办法效果前言 proguard 是压缩、优化和混淆Java字节码文件的免费的工具。 它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大…

网络故障的排错思路

一、网络排错必备知识 1、网络通信的基础设备和其对应的OSI层次 在网络通信中&#xff0c;了解基础设备如交换机、三层交换机、路由器和防火墙以及它们在OSI七层模型中 的作用至关重要。对于网络管理员和工程师来说&#xff0c;深入了解这些设备在OSI模型中的位置和功能可 …

探索Gin框架:Golang Gin框架请求参数的获取

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 我们在专栏的前面几篇文章内讲解了Gin框架的路由配置&#xff0c;服务启动等内容。 专栏地址&…

为什么有的人渐渐不点外卖了?

​随着互联网的发展和普及&#xff0c;外卖行业也在近几年内得到了迅猛的发展&#xff0c;它方便快捷、节省时间的特点使得外卖成为了很多人生活的一部分。但是&#xff0c;随着时间的推移&#xff0c;越来越多的人开始减少点外卖的频率&#xff0c;这是为什么呢&#xff1f; 首…

npm修改镜像源

背景&#xff1a;切换npm镜像源是经常遇到的事&#xff0c;下面记录下具体操作命令 1. 打开终端运行"npm config get registry"命令来查看当前配置的镜像源 npm config get registry2. 修改成淘宝镜像源"https://registry.npmjs.org/" npm config set re…
最新文章