【响应式编程-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;为机…

Spring 应用合并之路(二):峰回路转,柳暗花明 | 京东云技术团队

书接上文&#xff0c;前面在 [Spring 应用合并之路&#xff08;一&#xff09;&#xff1a;摸石头过河]介绍了几种不成功的经验&#xff0c;下面继续折腾… 四、仓库合并&#xff0c;独立容器 在经历了上面的尝试&#xff0c;在同事为啥不搞两个独立的容器提醒下&#xff0c;…

Web网页开发-CSS定位-笔记

一、CSS的三种布局 (1) 标准流 块级元素:一行一个 行内元素:一行多个&#xff0c;margin上下无效 行内块元素:一行多个 (2) 浮动 让元素同处一行 (3) 定位 让元素在浏览器中任何位置,并且覆盖住其他元素&#xff0c;能够固定死在浏览器上的某个位置&#xff0c;不随滚动条滚动 …

C++面对对象编程进阶(1)

面对对象编程进阶&#xff08;1&#xff09; 1.初始化列表2.类的继承3.深挖公有、私有及保护4.友元类5.类指针 1.初始化列表 C中类的初始化列表应用于构造函数初始化类的成员变量。其具体应用方法为&#xff1a; class Student {public:int age;string name;Student():age(0)…

G4周:CGAN,手势生成

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

Crow:路由局部插件1 设置插件

Crow:Middlewares的使用-CSDN博客 介绍了Crow中关于插件的使用,其实除了这种通用插件外,Crow还提供了为个别路由使用的局部插件。 先看例子: //examples/example_middleware.cpp struct SecretContentGuard : crow::ILocalMiddleware {struct context{};void before_hand…

Qt基础-属性系统详解

目录 一、定义 二、属性的使用 三、类的附加信息 四、实例演示 一、定义 Qt提供了一个Q_PROPERTY(

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;遇到了互联网时代才发现能补上自古…

马克思主义基本原理笔记

马克思主义哲学、政治经济学、科学社会主义理论 哲学 马克思主义中国化的理论成果&#xff1a;毛泽东思想、邓小平理论、三个代表重要思想、科学发展观 物质和意识哪个是本原&#xff0c;是哲学的基本问题 辩证法认为世界上的事物都是相互联系的、运动发展的&#xff0c;形…

Docker:docker exec命令简介

介绍 docker exec [OPTIONS] 容器名称 COMMAND [ARG...] OPTIONS说明&#xff1a; -d&#xff0c;以后台方式执行命令&#xff1b; -e&#xff0c;设置环境变量 -i&#xff0c;交互模式 -t&#xff0c;设置TTY -u&#xff0c;用户名或UID&#xff0c;例如myuser:myu…

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<…

84. 柱状图中最大的矩形 -- 单调栈

84. 柱状图中最大的矩形 class LargestRectangleArea:"""时间复杂度&#xff1a;O(N)空间复杂度&#xff1a;O(N)84. 柱状图中最大的矩形https://leetcode.cn/problems/largest-rectangle-in-histogram/description/"""def solution(self, heigh…

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 …