Java_方法引用

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

条件:

        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.hqwc.cn/news/675349.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆级教程:从 0 到 1 将项目发布到 Maven 中央仓库【2024年5月】

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩 最近写了一个参数校验组件&#xff0c;名字叫 spel-validator&#xff0c;是基于 javax.validation 的一个扩展&#xff0c;目的是简化参数校验。 我把项目开源到了GitHub https://github.com/stick-i/spel-validator …

操作系统:线程相关知识

目录 1.生产消费者模型 1.1.概念引入 1.2.基于阻塞队列的生产消费模型 1.3.POSIX信号量 1.3.1.再识信号量 1.3.2.信号量接口的学习 1.4.基于环行队列的生产消费模型 1.5.深刻理解生产消费模型 2.可重入函数与线程安全 1.生产消费者模型 1.1.概念引入 生产者-消费者模型…

08 - 条件判断语句

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 条件判断语句2. 语法说明3. 经验4. 代码 1. 条件判断语句 makefile 中支持条件判断语句 可以根据条件的值来决定 make 的执行可以比较两个不同变量或者变量和常量的值 注&#xff1a;条件判断语句只能用于控制 make 实际执行的…

js宏任务微任务输出解析

第一种情况 setTimeout(function () {console.log(setTimeout 1) //11 宏任务new Promise(function (resolve) {console.log(promise 1) //12 同步函数resolve()}).then(function () {console.log(promise then) //13 微任务})})async function async1() {console.log(async1 s…

【代码随想录——哈希表】

1.哈希表理论基础 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用…

HarmonyOS实战开发-如何实现查询当前城市实时天气功能

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式&#xff0c; 数据接口是和风&#xff08;天气预报&#xff09;&#xff0c; 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是&#xff0c;查询当前城市的实时天气&#xff0c; 目前已实现的功能…

水表集中抄表器是什么?什么叫水表集中抄表器?

1.简述 水表集中抄表器是一种智能化的智能设备&#xff0c;主要运用于高效率、清晰地收集管理方法住户或商业客户的用水数据信息。它摒弃了传统的人工抄表方法&#xff0c;完成了远程控制全自动抄表&#xff0c;大大提高了水务管理的效率和精确性。 2.功能特点 2.1实时数据分…

Gradle 进阶学习 之 build.gradle 文件

build.gradle 是什么&#xff1f; 想象一下&#xff0c;你有一个大型的乐高项目&#xff0c;你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中&#xff0c;build.gradle 就是这个清单&#xff0c;它告诉计算机如何构建&#xff08;组合&#xff09;你的软…

Python实现txt转Excel(坐标)

import pandas as pddef txt_to_excel(txt_file, excel_file):# 读取 txt 文件with open(txt_file, r) as f:lines f.readlines()# 将每行数据分割成多个单元格data []for line in lines:row line.strip().split( )data.append(row)# 将数据保存到 Excel 文件df pd.DataFra…

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作&#xff0c;没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…

LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs&#xff0c;两种情况 1.以root为根 2.不以root为根 但是这样需要两个dfs分别进行&#xff0c;那么时间复杂度就上去了。 class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点&#xff0c;可以延…

视频素材库在哪里找免费手机版?8个可以用手机浏览的素材网

在视觉内容占据主导地位的今天&#xff0c;合适的视频素材可以大大提升项目的吸引力和效果。以下列出的视频素材网站为广告制作者、社交媒体策略师及电影制作人提供了从传统到现代风格的各种视频素材选择&#xff0c;满足不同的创作需求。 1. 蛙学府&#xff08;中国&#xff…