Java_方法引用

news/2024/5/19 23:07:34

        方法引用就是把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体。

条件:

        1.引用处需要是函数式接口

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

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

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

简单代码演示:

        注意:方法引用也算引用,初始数组应使用引用数据类型Integer

public class FunctionDemo1 {public static void main(String[] args) {//创建数组Integer[] arr = {5,2,6,3,4,1};//按倒序排序Arrays.sort(arr, FunctionDemo1::subtraction);//输出数组System.out.println(Arrays.toString(arr));}public static int subtraction(int num1, int num2) {return num2 - num1;}
}
运行结果:

详细方法引用:

1.引用静态方法

代码演示
public class FunctionDemo2 {public static void main(String[] args) {/*集合中有以下字符串"1","2","3","4","5"引用静态方法,把他们都变成int类型*///创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"1","2","3","4","5");//引用静态方法list.stream().map(Integer::parseInt).forEach(s -> System.out.println(s + 1));}
}
运行结果:

2.引用成员方法

        1)引用其他类成员方法       

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

        代码演示:
        成员方法类:
public class StringOperation {public boolean StringOperation(String str) {return str.startsWith("张") && str.length() == 3;}
}
        测试类:
public class FunctionDemo3 {public static void main(String[] args) {//要求:将集合中姓张并且名字为3个字的人名提取出来//创建集合ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张大","张小小","张老老","王一","王一一");//引用其他类成员方法过滤list.stream().filter(new StringOperation()::StringOperation).forEach(s -> System.out.println(s));}
}
        运行结果:

        

        2)引用本类成员方法        

        格式:this::方法名

        3)引用父类成员方法        

        格式:super::方法名

        其他两种方法和第一种同理,在次不做演示,但是需要注意:不能在静态方法中引用本类成员方法或者父类成员方法,因为static修饰的方法中,没有this和super。

3.引用构造方法

        格式:类名::new

代码演示:
public class FunctionDemo4 {public static void main(String[] args) {//将集合中的元素转换成Student类型//创建集合ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张大,20","张小小,21","张老老,22","王一,23","王一一,24");list.stream().map(Student::new).forEach(s -> System.out.println(s));}
}
运行结果:

4.其他调用方式

        1)使用类名引用成员方法
        格式:

                类名::成员方法

        规则:

                1.需要有函数式接口

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

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

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

        抽象方法形参的详解:

        第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法,在Stream流中,第一个参数一般都表示流里面的每一个数据。

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

        局限性:

        不能引用所有类中的成员方法,是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法

        代码演示:
public class FunctionDemo5 {public static void main(String[] args) {//集合里面添加一些字符串,要求变成大写后输出//创建集合ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "abC","ABC","abc","ABc","Abc");list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));}
}
        运行结果:

        

        2)引用数组的构造方法
        格式:

                数据类型[ ]::new

        规则:

                数组类型需要跟流中数据的类型保持一致

        代码演示:
public class FunctionDemo6 {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));}
}
运行结果:

综合练习

练习一:
集合中存储一些字符串数据,比如:"张三,23"
收集到Student类型的数组当中(使用方法引用完成)
代码演示:
public class FunctionTest1 {public static void main(String[] args) {/*集合中存储一些字符串数据,比如:"张三,23"收集到Student类型的数组当中(使用方法引用完成)*///创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"han,21","ma,22","zhao,23");Student[] arr = list.stream().map(Student::new).toArray(Student[]::new);System.out.println(Arrays.toString(arr));}
}
运行结果:

练习二:
创建集合添加学生对象,学生对象属性:name,age
只获取姓名放到数组当中(使用方法引用完成)
代码演示:
public class FunctionTest2 {public static void main(String[] args) {/*创建集合添加学生对象,学生对象属性:name,age只获取姓名放到数组当中(使用方法引用完成)*///创建集合并添加元素ArrayList<Student> list = new ArrayList<>();list.add(new Student("han",21));list.add(new Student("ma",22));list.add(new Student("zhao",23));//只获取姓名放到数组当中String[] arr = list.stream().map(Student::getName).toArray(String[]::new);System.out.println(Arrays.toString(arr));}
}
运行结果:


http://www.mrgr.cn/p/83623045

相关文章

【工作记录】openjdk-22基础镜像的构建

背景 近期使用到的框架底层都用的是springboot3.0&#xff0c;要求jdk版本在17甚至更高。 于是决定制作一个基于openjdk22的基础镜像&#xff0c;本文对这一过程进行记录。 作为记录的同时也希望能够帮助到需要的朋友。 期望效果 容器内可以正常使用java相关命令且版本是2…

尊享面试100题(314.二叉树的垂直遍历python)

题目关键词&#xff0c;从左到右&#xff0c;从上到下&#xff0c;那么使用bfs宽度优先算法。 使用字典v保存每一列的值。 class Solution:def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []v defaultdict(list)qu deque()…

SparkSql介绍

概述 SparkSQL&#xff0c;顾名思义&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中&#xff0c;我们一起进行了FreeBSD RISCV 在QEME中实践 现在&#xff0c;让我们配置好网络吧&#xff01; 先上结论&#xff1a;用默认配置启动即可&#xff0c;网络就加载好了&#xff0c;只是不能ping罢了。因为不能ping&#xff0c;以为网络没通&#xff0…

excel如何将多列数据转换为一列?

这个数据整理借用数据透视表也可以做到&#xff1a; 1.先将数据源的表头补齐&#xff0c;“姓名” 2.点击插入选项卡&#xff0c;数据透视表&#xff0c;在弹出对话框中&#xff0c;数据透视位置选择 现有工作表&#xff0c;&#xff08;实际使用时新建也没有问题&#xff09;…

学习笔记480—Obsidian中如何实现思维导图功能-mindmap插件

Obsidian中如何实现思维导图功能-mindmap插件 思维导图插件 思维导图是大家耳熟能详的一类软件,以xmind为代表。那么在obsidian中如何实现思维导图效果呢,本文介绍思维导图插件Enhancing mindmap的安装与使用过程。 效果图插件下载 Github地址: https://github.com/MarkMind…

初识Fink

概述 Fink用于处理计算的,如下图所示,将交易、日志、物联网、点击流的数据输入到Flink中进行处理计算,处理完成之后输出到应用、日志、数据库中。Flink是以流的方式对数据进行处理的,所谓流就是源源不断,每时每刻都在有序的产生,例如设备仪器运行数据就属于数据流,因为设…

三角函数之和差化积公式

知识点1:三角函数奇偶性: \(\sin(-\theta)=-\sin\theta, \quad \cos(-\theta)=\cos\theta\)如上图: 单位半圆的半径为1,\(\triangle AOB\)为等腰三角形。 点\(C\)为线段\(AB\)之中点,连接\(CO\)。 根据等腰三角形的性质,\(OC\) 是 \(△AOB\) 的角平分线和垂直平分线。 \(…

每日一题 礼物的最大价值

题目描述 礼物的最大价值_牛客题霸_牛客网 解题思路 这是一个典型的动态规划问题。我们可以使用一个二维数组 dp[][] 来存储到达每个格子时可以获得的最大价值。状态转移方程为 dp[i][j] max(dp[i-1][j], dp[i][j-1]) grid[i][j]&#xff0c;表示到达当前格子的最大价值是从…

android init进程启动流程

一,Android系统完整的启动流程 二,android 系统架构图 三,init进程的启动流程 四,init进程启动服务的顺序 五,android系统启动架构图 六,Android系统运行时架构图 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// imme…

buuctf-pwn-get_started_3dsctf_2016

题目地址:https://buuoj.cn/challenges#get_started_3dsctf_2016 检查一下保护情况拖进ida分析主函数有个很明显的栈溢出漏洞 没有找到system函数,但是发现了这个函数后面有两种解题思路 0x01 调用get_flag函数 这个函数读取了flag.txt,并输出内容,那么我们就想办法溢出到这…

再议大模型微调之Zero策略

1. 引言 尽管关于使用Deepspeed的Zero策略的博客已经满天飞了&#xff0c;特别是有许多经典的结论都已经阐述了&#xff0c;今天仍然被问到说&#xff0c;如果我只有4块40G的A100&#xff0c;能否进行全量的7B的大模型微调呢&#xff1f; 正所谓“纸上得来终觉浅&#xff0c;…

《Video Mamba Suite》论文笔记(1)Mamba在时序建模中的作用

原文链接 https://arxiv.org/abs/2403.09626https://arxiv.org/abs/2403.09626 原文代码 https://github.com/OpenGVLab/video-mamba-suitehttps://github.com/OpenGVLab/video-mamba-suite 原文笔记 What 《Video Mamba Suite: State Space Model as a Versatile Altern…

群晖存储池损毁,加上错误操作删除

如何联系本人? 储存池被我误删除了,导致无法正常通过,格式化群晖第一、第二分区进行恢复。系统损毁了,先导出群晖设置,进入pe使用DiskGenius格式化你所有硬盘的第一个和第二个分区(大约是1-2个G大小的分区)切记不是删除分区, 第三个分区千万不要动,那是数据分区,然后…

普洱茶泡多少茶叶才算淡茶?

普洱茶淡茶一般放几克茶叶&#xff0c;品深茶官网根据多年专业研究与实践结果&#xff0c;制定了淡茶冲泡标准。在冲泡普洱茶淡茶时&#xff0c;茶叶的投放量是关键因素之一。淡茶冲泡标准旨在保持茶汤的清爽口感&#xff0c;同时充分展现普洱茶的独特风味。 根据《品深淡茶冲…

力扣刷题--数组--第二天

今天仍然做二分查找相关的题目。先来回顾一下二分查找的方法和使用的条件。二分查找是在数组中查找目标值的一种方法&#xff0c;通过边界索引确定中间索引&#xff0c;判断中间索引处的元素值和目标值的大小&#xff0c;来不断缩小查找区间。使用二分查找有如下一些限制&#…

nginx模型设计和进程讲解

一. Nginx进程模型解析 1. master主进程 和 worker工作进程 [rootlocalhost sbin]# ps -ef|grep nginx root 15411 1 0 21:08 ? 00:00:00 nginx: master process ./nginx nobody 15412 15411 0 21:08 ? 00:00:00 nginx: worker process root…

干货分享-策划人都在用的活动策划网站

职场上&#xff0c;学会借力&#xff0c;学会‘抄’&#xff0c;比辛辛苦苦做老黄牛&#xff0c;更能事倍功半&#xff0c;不仅自己省事省力&#xff0c;还能获得更多升职加薪的机会。 那么&#xff0c;职场新人如何快速的写出一份领导满意的方案&#xff1f; 今天分享的‘抄…

ue引擎游戏开发笔记(33)——武器与角色的匹配,将新武器装备到角色身上

1.需求分析&#xff1a; 武器能出现在世界中&#xff0c;完成了第一步&#xff0c;下一步需要角色和武器适配&#xff0c;即不论角色跑动&#xff0c;射击等&#xff0c;武器和角色都相匹配&#xff0c;将武器装备到角色身上。 2.操作实现&#xff1a; 1.首先先把角色原有的武…

C语言栈的含义与栈数据操作代码详解!

引言&#xff1a;在本篇博客中&#xff0c;我们将学到数据结构——栈&#xff0c;讲到栈的含义与关于栈的数据操作代码。栈可以在顺序表、双向链表以及单链表的基础上实现&#xff0c;而于本篇博客中&#xff0c;我们选择在顺序表的基础上实现栈。 更多有关C语言和数据结构知识…