【响应式编程-05】Lambda方法引用

一、简要描述

Lambda的方法引用也叫引用方法

  • 方法引用初体验
  • 方法引用的底层实现
  • 方法引用的语法格式
  • 方法引用举例
    • 静态方法引用
    • 构造方法引用
    • 普通方法引用
    • super和this方法引用
    • 数组的方法引用

二、方法引用初体验

为什么出现方法引用?

  • 引用已存在方法,避免重复逻辑
  • 代码更加简洁

Lambda函数体以存在,是否还有存在的必要? 答案是:没有存在的必要,直接方法引用调用。

三、方法引用的底层实现

1、使用cfr工具包解码Lambda字节码

使用java命令,cfr工具解析字节码 java -jar cfr-0.145.jar MethodReferenceFirstGo.class --decodelambdas false

2、使用Java命令打开dumps调试模式

Java命令java -Djdk.internal.lambda.dumpProxyClasses ClassName

打开调试模式

2.1、生成Lambda编译的class文件

生成后编译后的文件:

  • MethodReferenceFirstGo$$Lambda$1.class
  • MethodReferenceFirstGo$$Lambda$2.class

2.2、两个文件进行对比

四、方法引用语法格式

  • 方法引用运算符

        双冒号 ::

  • 那些方法可以引用?
    • 类方法 / 构造方法 / 实例方法
    • 被引用方法与函数式接口抽象方法:
      • 参数列表相同
      • 返回值类型相同
  • 方法引用语法格式

         格式:类名 :: 静态方法

                范例:Integer :: parseIn

        格式:类名 :: new

                范例:Student :: new

        格式:对象 :: 成员方法

                范例:hello :: toUpperCase

        格式:this :: 方法名 / super :: 方法名

五、方法引用示例

1、静态方法引用

1.1、定义Calcable接口类

package tech.flygo.lambda.demo6;/*** @description: 计算数值接口* @author: flygo* @time: 2023/8/12 11:16*/
@FunctionalInterface
public interface Calcable {/*** description: 定义一个抽象方法,传递一个整数,对整数进行绝对值计算并返回 <br>* date: 2023/8/12 11:17 <br>* author: flygo <br>** @return int* @param: number*/int calcAbs(int number);
}

1.2、定义StaticMethodReference主函数测试类

package tech.flygo.lambda.demo6;/*** @description: 通过类名引用静态成员方法 <br>* 类已经存在,静态成员方法也已经存在 <br>* 就可以通过类名直接引用静态成员方法 <br>* @author: flygo* @time: 2023/8/12 11:18*/
public class StaticMethodReference {/*** description: 定义一个方法,方法的参数传递要计算绝对值的整数,和函数式接口Calcable <br>* date: 2023/8/12 11:19 <br>* author: flygo <br>** @return int* @param: number* @param: c*/public static int method(int number, Calcable c) {return c.calcAbs(number);}public static void main(String[] args) {// 调用method方法,传递计算绝对值的整数和Lambda表达式int number = method(-10, (n) -> {// 对参数进行绝对值计算并返回结果return Math.abs(n);});System.out.println(number);// 使用方法引用优化Lambda表达式/*** Math类是存在的* abs计算绝对值的静态方法也是存在的* 所有我们可以直接通过类名引用静态方法*/int result = method(-20, Math::abs);System.out.println(result);}
}

1.3、代码示例

2、构造方法引用

2.1、定义Person类

package tech.flygo.lambda.demo7;/*** @description: 人类* @author: flygo* @time: 2023/8/12 11:45*/
public class Person {private String name;public Person() {}public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

2.2、定义一个创建Person对象的函数式接口

package tech.flygo.lambda.demo7;/*** @description: 定义一个创建Person对象的函数式接口* @author: flygo* @time: 2023/8/12 11:47*/
@FunctionalInterface
public interface PersonBuilder {/*** description: 定义一个方法,根据传递的姓名,创建Person对象返回 <br>* date: 2023/8/12 11:48 <br>* author: flygo <br>** @return tech.flygo.lambda.demo7.Person* @param: name*/Person buildPerson(String name);
}

2.3、定义ConstructorMethodReference主函数测试类

package tech.flygo.lambda.demo7;/*** @description: 类的构造器(构造方法)引用* @author: flygo* @time: 2023/8/12 11:49*/
public class ConstructorMethodReference {/*** description: 定义一个方法,参数传递姓名和PersonBuilder接口,方法中通过姓名创建Person对象 <br>* date: 2023/8/12 11:50 <br>* author: flygo <br>** @return void* @param: name* @param: builder*/public static void printName(String name, PersonBuilder builder) {Person person = builder.buildPerson(name);System.out.println(person.getName());}public static void main(String[] args) {// 调用printName方法,方法的参数PersonBuilder接口是一个函数式接口,可以传递Lambda表达式printName("刘德华", name -> new Person(name));// 使用方法引用优化Lambda表达式/**构造方法 new Person(String name)已知创建对象已知 new就可以使用Person引用new创建对象*/// 使用Person类带参数的构造方法,通过传递的姓名创建对象printName("周欣欣", Person::new);}
}

2.4、代码示例和运行结果

3、普通方法引用

3.1、定义一个打印的函数式接口Printable

package tech.flygo.lambda.demo8;/*** @description: 定义一个打印的函数式接口* @author: flygo* @time: 2023/8/12 12:14*/
@FunctionalInterface
public interface Printable {/*** description: 定义打印字符串的抽象方法 <br>* date: 2023/8/12 12:15 <br>* author: flygo <br>** @return void* @param: s*/void print(String s);
}

3.2、打印字符串的对象类MethodRerObject

package tech.flygo.lambda.demo8;/*** @description: 打印字符串的对象类* @author: flygo* @time: 2023/8/12 12:15*/
public class MethodRerObject {/*** description: 定义一个成员方法,传递字符串,把字符串转换成大写输出 <br>* date: 2023/8/12 12:16 <br>* author: flygo <br>** @return void* @param: str*/public void printUpperCaseString(String str) {System.out.println(str.toUpperCase());}
}

3.3、通过对象名引用成员方法测试类

package tech.flygo.lambda.demo8;/*** @description: 通过对象名引用成员方法* 使用前提是对象名是已经存在的,成员方法也是已经存在的* 就可以使用对象名来引用成员方法* @author: flygo* @time: 2023/8/12 12:17*/
public class ObjectMethodReference {/*** description: 定义一个方法,方法的参数传递Printable接口 <br>* date: 2023/8/12 12:20 <br>* author: flygo <br>** @return void* @param: printable*/public static void printString(Printable printable) {printable.print("Hello");}public static void main(String[] args) {// 调用printString方法,方法的参数Printable是一个函数式接口,所以可以传递Lambda表达式printString(s -> {// 创建MethodRerObject对象MethodRerObject object = new MethodRerObject();// 调用MethodRerObject对象中的成员方法printUpperCaseString,把字符串按照大写输出object.printUpperCaseString(s);});// 创建MethodObject对象MethodRerObject object = new MethodRerObject();/*使用方法引用优化Lambda对象是已经存在的MethodRerObject成员方法是已经存在的printUpperCaseString所以可以使用对象名引用尘缘方法*/printString(object::printUpperCaseString);}
}

3.4、示例代码和运行结果

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

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

相关文章

四则运算 C语言xdoj20

问题描述&#xff1a; 输入两个整数和一个四则运算符&#xff0c;根据运算符计算并输出其运算结果&#xff08;和、差、积、商、余之一&#xff09;。注意做整除及求余运算时&#xff0c;除数不能为零。 输入说明&#xff1a; 使用scanf()函数输入两个整数和一个运算符&#xf…

政府采购变数大,AI PC是联想的“新希望”?

文&#xff5c;新熔财经 作者&#xff5c;余一 发布两款AI PC&#xff0c;并预热CES将有AI PC大动作后&#xff0c;联想似乎找到了计算机终端的新思路。 而在这之前&#xff0c;联想终端业务面临的挑战不可谓不严重。 “事业单位更换纯国产电脑”、“联想被排除在大订单之外…

前端面试题-nodejs

1.什么是nodejs&#xff0c;它与传统的网页服务器有什么不同&#xff1f; 是什么&#xff1f;nodejs是基于Chrome V8引擎的JavaScript运行环境&#xff0c;它可以使JavaScript代码在服务器上运行。 有什么不同&#xff1f;第一&#xff0c;nodejs采用事件驱动、非阻塞式I/O模型…

汽车电子行业的 C 语言编程标准

前言 之前分享了一些编程规范相关的文章&#xff0c;有位读者提到了汽车电子行业的MISRA C标准&#xff0c;说这个很不错。 本次给大家找来了一篇汽车电子行业的MISRA C标准的文章一同学习下。 什么是MISRA&#xff1f; MISRA (The Motor Industry Software Reliability Ass…

微型导轨在设备中起什么作用

微型导轨精度高&#xff0c;摩擦系数小&#xff0c;自重轻&#xff0c;结构紧凑&#xff0c;可以用于电子制造设备、半导体制造设备、医疗设备、光学设备和机器人等各种工业机械设备中&#xff0c;那么微型导轨在设备中起什么作用呢&#xff1f; 1、导向与定位&#xff1a;为机…

G4周:CGAN,手势生成

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、CGAN介绍 条件生成对抗网络&#xff08;…

Visio导出eps格式图片

Visio导出eps格式图片 文章目录 Visio导出eps格式图片1. Visio中使用Adobe Acrobat虚拟打印2. Adobe Acrobat中裁剪并另存为eps格式 如何使用Visio绘图然后导出.eps格式的图片呢&#xff1f;这个过程需要用到Adobe Acrobat&#xff0c;使用Adobe Acrobat的虚拟打印功能&#xf…

ssm基于JAVA的驾校信息管理系统设计论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

Java HashMap 面试题(一)

HashMap 面试题&#xff08;一&#xff09; 文章目录 HashMap 面试题&#xff08;一&#xff09;3.3 面试题-说一下HashMap的实现原理&#xff1f;面试题-HashMap的put方法的具体流程hashMap常见属性源码分析 3.3 面试题-说一下HashMap的实现原理&#xff1f; HashMap的数据结…

篇三:让OAuth2 server支持密码模式

由于Spring-Security-Oauth2停止维护&#xff0c;官方推荐采用 spring-security-oauth2-authorization-server&#xff0c;而后者默认不支持密码授权模式&#xff0c;本篇实战中采用的版本如下&#xff1a; <dependency><groupId>org.springframework.security<…

1-02VS的安装与测试

一、概述 对于一名C语言程序员而言&#xff0c;进行C语言程序的开发一般需要一个文本编辑器加上一个编译器就足够了。但为了方便起见&#xff0c;我们选择使用集成开发环境——Visual Studio&#xff08;简称VS&#xff09;。安装Visual Studio 下面讲一下如何安装VS&#xff0…

【AI视野·今日Sound 声学论文速览 第三十八期】Mon, 1 Jan 2024

AI视野今日CS.Sound 声学论文速览 Mon, 1 Jan 2024 Totally 5 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers The Arrow of Time in Music -- Revisiting the Temporal Structure of Music with Distinguishability and Unique Orientability as the …

金和OA C6 MailTemplates.aspx SQL注入漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

【DevOps-07-3】Jenkins集成Sonarqube

一、简要说明 Jenkins安装Sonarqube插件Jenkins安装和配置Sonar-Scanner信息Jenkins打包项目中,增加Sonar-Scanner代码质量扫描二、Jenkins安装Sonarqube插件 1、登录Jenkins管理后台,搜索安装Sonar-Scanner插件 Jenkins管理后台示例:http://192.168.95.131:8080/jenkins/

Oracle数据库新手零基础入门,Oracle安装配置和操作使用详解

一、教程描述 本套教程是专门为初学者量身定制的&#xff0c;无需任何Oracle数据库基础&#xff0c;课程采用循序渐进的教学方式&#xff0c;从Oracle数据库的基础知识开始讲起&#xff0c;并不会直接涉及到一项具体的技术&#xff0c;而是随着课程的不断深入&#xff0c;一些…

docker部署mysql主从复制篇

环境准备&#xff1a;docker服务安装&#xff0c;mysql镜像 配置文件方式&#xff1a;可以挂载目录&#xff0c;也可以写好配置文件&#xff0c;利用docker cp 到容器内&#xff0c;这里直接在启动镜像创建容器时候挂载目录方式服务器上配置文件内容(下图标红路径)&#xff1a…

WEB 3D技术 three.js 顶点缩放

本文 我们来说 顶点缩放 我们官网搜索 BufferGeometry 下面有一个 scale 函数 例如 我们先将代码写成这样 上面图片和资源文件 大家需要自己去加一下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/j…

MySQL 临时表

MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的。 临时表只在当前连接可见&#xff0c;当关闭连接时&#xff0c;MySQL 会自动删除表并释放所有空间。 在 MySQL 中&#xff0c;临时表是一种在当前会话中存在的表&#xff0c;它在会话结束时会自动被销毁…

【教学类-09-04】20240102《游戏棋N*N》数字填写,制作棋子和骰子

作品展示 背景需求&#xff1a; 最近在清理学具材料库&#xff0c;找到一套1年多前的《N*N游戏棋》&#xff0c;把没有用完的棋盘拿出来&#xff0c;&#xff0c;想给大4班换花样&#xff0c;并把它们用掉。 程序代码在这里 【教学类-09-03】20221120《游戏棋10*10数字如何直接…

一篇五分生信临床模型预测文章代码复现——Figure 10.机制及肿瘤免疫浸润(九)——Estimate——倒数第二节

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…