Java方法引用(上)

Java方法引用

  • 基础知识
  • 什么是方法引用?

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

  • 使用方法引用的条件

方法引用必须满足以下几个条件:

1.引用处必须是函数式接口

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

3,被引用方法的形参和返回值

需要跟抽象方法保持一致

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

比如,使用Arrays.sort方法时我们需要实现一个Comparator接口的匿名类,使用方法引用后,可以使用已定义的满足上述条件的方法进行实现。

Arrays.sort(arr,new Comparator<Integer>(){@overridepublic int compare(Integer o1,Integer o2){return o2 -o1;}});

可以使用如下方法:

public int subtraction(int nl,int n2){return n2 -n1;}

示例,如下:

import java.util.Arrays;
import java.util.Comparator;public class FuncInvokeDemo1 {public static void main(String[] args) {//需求:创建一个数组,进行倒序排列Integer[] arr ={3,5,4,1,6,2};//1.匿名内部类实现/*Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});// 输出System.out.println(Arrays.toString(arr));*///2.lambda表达式实现Arrays.sort(arr, (Integer o1, Integer o2) -> {return o2 - o1;});System.out.println(Arrays.toString(arr));//3.lambda表达式简化格式实现/*Arrays.sort(arr, (o1, o2) -> o2 - o1);System.out.println(Arrays.toString(arr));*///4.方法引用//需要满足的条件://a.引用处需要是函数式接口//b.被引用的方法需要己经存在//c.被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致//d.被引用方法的功能需要满足当前的要求//本类中的示例静态方法subtraction满足要求,可用于方法引用// 使用双冒号::操作符,表示把subtraction方法当成实现的接口的抽象方法的方法体Arrays.sort(arr, FuncInvokeDemo1::subtraction);}/*** 被引用的方法体实现* @param i1 参数1* @param i2 参数2* @return 参数2-参数1*/public static int subtraction(Integer i1, Integer i2){return i2 - i1;}
}
  • 小结

1.什么是方法引用?

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

2.::是什么符号?方法引用符

3.方法引用时要注意什么?

●需要有函数式接口

●被引用方法必须已经存在

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

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

  • 方法引用的分类
  • 引用静态方法

格式:类名::静态方法

范例:Integer::parseInt

练习

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;public class FInvokeDemo2 {public static void main(String[] args) {// 创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "1", "2", "3", "4", "5");// 使用stream和匿名内部类List<Integer> iList = list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s);}}).collect(Collectors.toList());//System.out.println(iList);// 使用stream和lambda// 引用方法时比lambda更简洁List<Integer> iList2 = list.stream().map(Integer::parseInt).collect(Collectors.toList());System.out.println(iList2);}
}

  • 引用成员方法

格式:对象::成员方法

①其他类:其他类对象::方法名

②本类:this::方法名

③父类:super::方法名

注意:引用本类的静态方法时也需要使用类名进行引用,而不能使用this关键字。另外,引用本类的成员方法时,也不能在本类的静态方法里使用this关键字引用,需要首先new一个本类的对象才可以。因此,使用this::和super::的引用处不能是静态方法内。

练习1:

集合中有下些名字,按照要求过滤数据

数据:"张无忌","周芷若","赵敏","张强","张三丰"

要求:只要以张开头,而且名字是3个字的

提供方法体的外部类:

public class StringOperation {/*** 方法引用体* @param s* @return*/public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;}
}

使用方法体的代码:

import java.util.ArrayList;
import java.util.Collections;public class FInvokeDemo3 {public static void main(String[] args) {// 创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");// 过滤数据并打印/*list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));*/// 引用成员方法时可以new一个对象list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s));// 引用成员方法前创建一个对象// 然后使用对象名进行引用StringOperation so = new StringOperation();list.stream().filter(so::stringJudge).forEach(s -> System.out.println(s));}
}

练习2:

GUI界面中点击事件的方法引用写法

  1. 引用其他类的成员方法

  1. 引用本类的成员方法

  1. 引用父类的成员方法

  • 引用构造方法

格式:类名::new

范例:Student::new

引用构造方法一般是为了创建对象。

练习:

集合里面存储姓名和年龄,比如:张无忌,15

要求:将数据封装成Student对象并收集到List集合中

代码如下:

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 此方法用于匹配流里的map方法实现体* @param str*/public Student(String str){this.name = str.split(",")[0];this.age = Integer.valueOf(str.split(",")[1]);}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}

引用构造方法:

import java.util.ArrayList;
import java.util.Collections;public class FInvokeDemo4 {public static void main(String[] args) {// 创建对象并添加ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌,25","周芷若,31","赵敏,21","张强,18","张三丰,57");// 利用stream封装并打印list.stream().map(Student::new).forEach(student -> System.out.println(student));}
}

  • 其他调用方式
  1. 使用类名引用成员方法(理解起来有点难度)

格式:类名::成员方法

范例:String::substring

方法引用的规则:

1.需要有函数式接口

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

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

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

抽象方法形参的详解:

第一个参数:表示被引用方法的调用者,其决定了可以引用哪些类中的方法在Stream流当中,第一个参数一般都表示流里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法

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

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

import java.util.ArrayList;
import java.util.Collections;public class FInvokeDemo5 {public static void main(String[] args) {/*方法引用(类名引用成员方法)格式类名::成员方法需求:集合里面一些字符串,要求变成大写后进行输出方法引用的规则:1.需要有函数式接口2.被引用的方法必须已经存在3.被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致。4.被引用方法的功能需要满足当前的需求抽象方法形参的详解:第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法在Stream流当中,第一个参数一般都表示流里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法*/// 创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "aaa", "bbb", "ccc");// 转换为大写并打印// 本例中的String::toUpperCaselist.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));}
}

  1. 引用数组的构造方法

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

范例:int[]::new

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class FInvokeDemo6 {public static void main(String[] args) {//1.创建集合并添加元素ArrayList<Integer> list =new ArrayList<>();Collections.addAll(list,1,2,3,4,5);//2.收集到数组当中/*Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});*/// 将以上代码改成方法引用:// 注意事项:数组的类型,需要跟流中数据的类型保持一致。Integer[] arr = list.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(arr));}
}

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

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

相关文章

LeetCode 每日一题 Day 2

1423. 可获得的最大点数 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 …

区块链媒体:Web3.015个方法解析-华媒舍

Web3.0是第三代互联网的发展阶段&#xff0c;相较于Web2.0&#xff0c;它具有更高的可信性、安全性和去中心化特点。在Web3.0时代&#xff0c;推广变得更为重要&#xff0c;因为吸引用户和提高品牌知名度对于在竞争激烈的市场中脱颖而出至关重要。本文将揭秘推广Web3.0的15个秘…

c++的函数对象和适配器

函数对象 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<functional> #include<vector> #include<algorithm> using namespace std; bool func(int val1,int val2) {return val1 > val2; } void test() {vector<int>v;v.pus…

P2 Linux系统目录结构

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专…

二维数组处理(一)

输入整型二维数组a&#xff08;5行5列&#xff09;&#xff0c;完成如下要求&#xff1a; 输出二维数组a。 将a的第2行和第4行元素对调后&#xff0c;形成新的二维数组a并按行输出&#xff0c;每个元素之间隔一个空格。(行号从0开始计算)。 用对角线&#xff08;指二维数组左…

如何跑通跨窗口渲染:multipleWindow3dScene

New 这是一个跨窗口渲染的示例&#xff0c;用 Three.js 和 localStorage 在同一源&#xff08;同产品窗口&#xff09;上跨窗口设置 3D 场景。而这也是本周推特和前端圈的一个热点&#xff0c;有不少人在争相模仿它的实现&#xff0c;如果你对跨窗口的渲染有兴趣&#xff0c;可…

linux 安装go环境

下载go SDK All releases - The Go Programming Language 此处建议选择与本机windows一样的版本&#xff0c;便于调试&#xff0c;若不涉及本地windows&#xff0c;则忽略此提示 上传到linux 解压go SDK 执行下述命令进行解压 tar -xvf go1.19.linux-amd64.tar.gz 此处选择…

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg

tcp/ip协议 error10022 这2个注册表选项千万不能删除&#xff0c;否则上不了网。 按下windows键R键&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;在文件目录里找到如下两个文件夹&#xff0c;删除这两个文件夹。 路径&#xff1a;HKEY_LOCAL_MACHINE\System\C…

12.二维字符数组——输出basic和BASIC

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维字符数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 输出basic和BASIC 二、题目分析 法一&#xff1a; for(i0;i<1;i){ for(j0;j<6;j){ putchar(a[i][j]); pri…

RxJava

Single 使用 Flowable 比较重一般使用Single onSubscribe 产生订阅时调用 线程切换1 2 发送顺序事件.just just 源码 钩子方法,进行验证再处理 Single 对象 订阅,RxJavaPlugins.onSubscribe 钩子方法,产生订阅和过滤 Single 核心方法,抽象的,实现为SingleJust 订阅和执行成功回…

视图层与模板层

视图层 1 视图函数 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python 函数&#xff0c;它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容&#xff0c;一个重定向&#xff0c;一个404错误&#xff0c;一个XML文档&#xff0c;或者一张图片. . . 是…

穷游?“穷”游?

Description 贫穷的小A有一个梦想&#xff0c;就是到t国去一次穷游&#xff0c;但现实是残酷的。小A所在的世界一共有n(n<500)个国家&#xff0c;国家与国家之间总共有E(E<50000)条道路相连&#xff0c;第i个国家对于进入它的外国人都要收取Bi的费用&#xff0c;而小A家住…

93基于matlab的萤火虫算法优化支持向量机(GSA-SVM)分类模型

基于matlab的萤火虫算法优化支持向量机&#xff08;GSA-SVM&#xff09;分类模型&#xff0c;以分类精度为优化目标优化SVM算法的参数c和g&#xff0c;输出分类可视化结果。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 93萤火虫算法优化支持向量机 (xiaoh…

盘点25个Html游戏Game源码网页爱好者不容错过

盘点25个Html游戏Game源码网页爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 下载链接&#xff1a;https://pan.baidu.com/s/1lSNLjWB4xMuLV8m_kDtczw?pwd6666 提取码&#xff1a;6666 项目名称 21点游戏 H5…

将多个字节对象组成的列表中的多个字节对象连接成为一个字节对象bytes.join()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将多个字节对象组成的列表 中的多个字节对象 连接成为一个字节对象 bytes.join() [太阳]选择题 请以下代码输出的结果是&#xff1f; byte_list [bK,be,by] print("【显示】byte_list&q…

智慧用电安全动态监控系统

智慧用电安全动态监控系统是一种先进的电力监控技术系统&#xff0c;它运用物联网、大数据、云计算等先进技术&#xff0c;对电力系统的运行状况进行实时监控和预警。 该系统依托电易云-智慧电力物联网&#xff0c;通过智能传感终端采集电气线路的实时运行数据&#xff0c;客户…

面试题:说说 Cookie、Session、Token、JWT?

文章目录 什么是认证&#xff08;Authentication&#xff09;什么是授权&#xff08;Authorization&#xff09;什么是凭证&#xff08;Credentials&#xff09;什么是 Cookiecookie 重要的属性 什么是 Sessionsession 认证流程 Cookie 和 Session 的区别什么是 Token&#xff…

vscode console.log快捷键

在 Visual Studio Code 中&#xff0c;您可以使用快捷键「Ctrl Shift P」&#xff08;Mac 用户请使用「Cmd Shift P」&#xff09;打开命令面板&#xff0c;然后输入「Editor: Insert Console.log」即可快速插入「console.log」代码。此快捷键已内置于 Visual Studio Code …

23种设计模式之C++实践(二)

23种设计模式之C++实践 3. 设计模式(二)组合型模式7. 适配器模式——不兼容结构的协调7.2:类适配器模式7.3:双向适配器模式适配器模式总结8.桥接模式——处理多维度变化桥接模式总结9. 组合模式——树形结构的处理9.2 透明组合模式9.3 安全组合模式组合模式总结10. 装饰模式…

解读Java虚拟机垃圾回收器:探究经典算法背后的奥秘

目录 一、GC分类与性能指标 &#xff08;一&#xff09;垃圾回收器分类 &#xff08;二&#xff09;性能指标 &#xff08;三&#xff09;不可能三角 二、不同的垃圾回收器概述 三、Serial回收器&#xff1a;串行回收 四、ParNew回收器&#xff1a;并行回收 五、Parall…