方法引用(JAVA笔记第三十四期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解

目录

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

方法引用概念

方法引用是指把已经有的方法拿过来用,当作函数式接口抽象方法的方法体
方法引用有以下规定

  1. 应用处必须是函数式接口
  2. 被引用的方法必须已经存在
  3. 被引用方法的形参和返回值需要跟抽象方法保持一致
  4. 被引用方法的功能要满足当前需求

举例

import java.util.Arrays;public class Demo1 {public static void main(String[] args) {//数组进行倒序排列Integer[]arr = {1,2,9,5,4,3,0};//表示引用Demo1类里面的subtraction方法//把这个方法当作抽象方法的方法体Arrays.sort(arr,Demo1::subtraction);System.out.println(Arrays.toString(arr));}public static int subtraction(int num1,int num2){return num2-num1;}
}

方法引用的分类

  1. 引用静态方法
  2. 引用成员方法
    • 引用其他类的成员方法
    • 引用本类的成员方法
    • 引用父类的成员方法
  3. 引用构造方法
  4. 其他调用方法
    • 使用类名引用成员方法
      引用数组的构造方法

引用静态方法

格式:类名::静态方法名
举例

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class Demo2 {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");//常规方式ArrayList<Integer> list2 = new ArrayList<>();for (String s : list) {list2.add(Integer.parseInt(s));}System.out.println(list);list.stream().map(new Function<String, Object>() {@Overridepublic Object apply(String s) {int i = Integer.parseInt(s);return i;}}).forEach(s-> System.out.println(s));//方法引用list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));}
}

引用成员方法

格式:对象::成员方法

引用其他类的成员方法

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;public class Demo3 {public static void main(String[] args) {//集合中过滤数据//过滤出以张开头的3个字的名字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));//过滤数据list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张")&&s.length()==3;}}).forEach(s -> System.out.println(s));//方法引用list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s));}
}
//====================================================
class StringOperation{public boolean stringJudge(String s){return s.startsWith("张")&&s.length()==3;}
}

引用本类的成员方法

格式:this::方法名(引用处不是静态方法)

引用父类的成员方法

格式:super::方法名(引用处不是静态方法)

引用构造方法

格式:类名::new
举例

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;public class Demo4 {public static void main(String[] args) {//集合中存储的数据将其封装成Student对象并收集到list集合中ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"李四,18","张军,20","张军,19","王五,22");List<Student> newList = list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {String name = s.split(",")[0];int age = Integer.parseInt(s.split(",")[1]);return new Student(age, name);}}).collect(Collectors.toList());System.out.println(newList);//方法引用List<Student> newList2 = list.stream().map(Student::new).collect(Collectors.toList());System.out.println(newList2);}
}
//==================================================
class Student{private int age;private String name;//被引用的构造方法public Student(String s) {this.name = s.split(",")[0];this.age = Integer.parseInt(s.split(",")[1]);}public Student() {}public Student(int age, String name) {this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}
}

其他调用方法

使用类名引用成员方法

格式:类名::成员方法

该种方法引用有以下规定

  1. 应用处必须是函数式接口
  2. 被引用的方法必须已经存在
  3. 被引用方法的形参和需要跟抽象方法的第二个形参直到最后一个形参保持一致,返回值要保持一致
  4. 被引用方法的功能要满足当前需求
    .
    抽象方法的形参:
    第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法
    在stream流中,第一个参数一般都指流里面的每一个数据
    假设流中的数据都是字符串,那么使用这种方式进行方法引用,只能引用String类中的方法
    第二个参数直到最后一个参数:跟被引用方法的形参一致。如果没有第二个参数,说明被引用的方法需要是无参的构造方法
package study.Stream;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class Demo5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"aaa","bbb","ccc","ddd");list.stream().map(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}).forEach(s -> System.out.print(s+" "));System.out.println();//方法引用list.stream().map(String::toUpperCase).forEach(s -> System.out.print(s+" "));}
}

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

引用数组的构造方法

格式:数组类型[]::new
举例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.IntFunction;public class Demo6 {public static void main(String[] args) {//将集合中的数据收集到数组中ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,1,2,3,4);Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});System.out.println(Arrays.toString(arr));//方法引用Integer[] arr2 = list.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(arr2));}
}

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

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

相关文章

工业相机选取

1.相机分类&#xff1a; 1.1 在相机曝光方式中&#xff0c;全局曝光和卷帘曝光是两种主流技术。CCD相机通常采用全局曝光方式&#xff0c;而CMOS相机则可能采用卷帘曝光。 面阵相机与全局曝光关联与区别 关联&#xff1a;面阵相机可以使用全局曝光作为曝光方式&#xff0c;但…

使用Windows自带的IIS搭建FTP服务端

1、启用IIS功能 2、打开IIS 3、将默认的站点删除 4、创建FTP服务端 &#xff08;1&#xff09;选中站点&#xff0c;然后点击鼠标邮件&#xff0c;点击添加FTP站点 &#xff08;2&#xff09;指定站点名称和物理路径 物理路径&#xff1a;FTP服务端数据的路径&#xff0c;F…

研界的福尔摩斯——扩增子+qPCR

微生物在生物地球化学循环、动植物健康等多种领域发挥作用&#xff0c;因此&#xff0c;精确测量微生物绝对丰度对理解其与人类健康、植物生长等的关系至关重要。 常规扩增子测序分析只能解析样本中的物种组成和其相对丰度信息&#xff0c;并不能反映样本每种微生物的真实数量…

期权懂|期权到期了,可以不行权吗?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权到期了&#xff0c;可以不行权吗&#xff1f; 期权到期后&#xff0c;投资者并非必须行权。如果行权无利可图或不符合预期收益&#xff0c;可以选择放弃行权&#xff0c;让期…

SL1571B 输入5V2A或单节锂电池,升压12V 10W 升压恒压芯片

一、概述 SL1571B是一款高功率密度的异步升压转换器&#xff0c;专为便携式系统提供高效且小尺寸的解决方案。它内置MOS管&#xff0c;具有120mΩ功率开关&#xff0c;支持宽输入电压范围&#xff0c;并具备多种保护功能。 二、主要特性 输入电压范围&#xff1a;SL1571B的输…

接口测试vs功能测试

接口测试和功能测试的区别&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什…

ubuntu20.04_从零LOD-3DGS的复现

环境要求 创建环境 conda create -n lod-3dgs python3.71. 安装CUDA11.6和相应cuDNN。 1.1 CUDA CUDA安装参考CUDA1&#xff1b;CUDA11.6&#xff0c;安装过程相似。 1.2 cuDNN 参考&#xff0c;下载对应版本后复制到对应CUDA里面。 cp cuda/lib64/* /usr/local/cuda-11…

IIS安装,Sql Server安装

在Windows操作环境下&#xff0c; 首先检查是否安装IIS&#xff0c;在“管理工具”中查看目录中是否存在Internet Information Services&#xff08;IIS&#xff09;的文件&#xff0c;存在则IIS已经安装成功。未安装则使用以下步骤&#xff1a; 1、使用winR打开控制面板&…

【LeetCode】【算法】64. 最小路径和

LeetCode 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路 思路&#xff1a;这种题太典了&#xff0c;典…

win11安装wsa 安卓

今天和大家分享一个如何在windows10/11/12操作系统上使用Windows Subsystem for Android安卓APK应用系统的教程&#xff1b;网络上有很多教程&#xff0c;但是来回折腾很久也是各种问题&#xff0c;经过研究&#xff0c;找到一套完整有效的方案&#xff1b; 第一步、进入系统设…

美食网的设计与实现

摘 要 随着科技的发展、生活水平的提升&#xff0c;人们更加注重饮食搭配和饮食健康。通过网络技术来加强美食与健康知识的普及是当前一种可行的措施。通过网页浏览美食网&#xff0c;不仅可以普及每道美食的做法&#xff0c;通过制作美食来缓解心情&#xff0c;还可以通过美…

2024-2025年EI会议时间表,把握未来学术研讨机遇

2024-2025年多场国际学术会议将在中国多地举办&#xff0c;涵盖网络、通信、AI等领域&#xff0c;均支持EI等检索。会议时间、地点及检索信息已提供&#xff0c;涉及北京、淮北、深圳等城市。 以下是部分精品学术会议基本信息&#xff0c;欢迎点击链接查看&#xff1a; 第二届…

QML —— 圆形波浪进度条控件(附上源码)

效果 说明 QML中使用画布元素(canvas element),使用画布元素可画出各种各样的图形,同时允许脚本绘制。画布元素提供了一个依赖于分辨率的位图画布,也可以使用JavaScript脚本来绘制图形,制作游戏或者其它的动态图像。QML中的画布元素是基于HTML5的画布元素来完成的。    …

echarts引入自定义字体不起作用问题记录

echarts引入自定义字体不起作用问题记录 1、问题描述 初始化界面字体不作用&#xff0c;当界面更新后字体样式正常显示 2、原因描述 这通常是由于字体文件加载延迟导致的。ECharts 在初始化时可能还没有加载完字体文件&#xff0c;因此无法正确应用字体样式 3、解决方案 …

UE5.4 PCG 生成藤蔓墙体

一、新建Actor&#xff0c;添加Spline组件&#xff0c;挂上PCG组件&#xff0c;设置“墙体”和“植被”为静态网格体变量 二、编写PCG_Wall 1.生成墙体 2.生成墙体植被

【网络】子网掩码

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是子网掩码&#xff0c;并且能熟练掌握子网掩码的相关计算。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会…

Worldly平台更新Higg FEM 2024模块价格及购买指南

近日&#xff0c;LEVERAGE供应链管理从美国可持续服装联盟&#xff08;Cascale&#xff09;验证官方Worldly平台模块订阅更新中获悉&#xff0c;FEM2024模块价格更新的重要信息。此次更新涉及工厂环境模块&#xff08;FEM&#xff09;和工厂社会劳工模块&#xff08;FSLM&#…

Rocky9通过Docker-compose部署zabbix 7.0.5

Rocky9通过Docker-compose部署zabbix 7.0.5 1. 实验环境架构2. Zabbix-Server准备工作2.1 更新仓库2.2 安装docker-ce2.3 安装docker-compose 3. 安装Zabbix项目3.1 克隆项目3.2 预下载镜像3.3 启动Zabbix 4. 启动web管理端4.1 登录web管理页4.2 修改时区和语言 5. Agent安装配…

企业内训系统

在当今这个竞争激烈的市场环境中&#xff0c;企业的持续发展不仅依赖于外部市场的拓展&#xff0c;更离不开内部团队能力的提升。企业内训系统&#xff0c;作为提升企业竞争力、促进员工成长的重要工具&#xff0c;正逐渐成为现代企业管理中不可或缺的一环。本文将深入探讨企业…

QT自定义控件封装

QT自定义控件封装 1.概述 这篇文章介绍如何创建UI文件&#xff0c;通过自定义方式将两个控件联动起来&#xff0c;实现自定义功能。 2.创建UI文件 新建一个widget的普通项目&#xff0c;然后在项目名称上右键选择And New... 新建文件&#xff0c;然后选择QT 再选择Qt Desig…