匿名内部类、Lambda、方法引用 的总结
在今天的项目中看到这样一行代码
Integer syncCount = consumer.consumerInfo( Collections.singletonList(KafkaTopicConst.Event_BMS_SYSLOG_ROLE),consumer::handle);
直接傻眼,无法理解consumer::handle这种用法,因此总结如下
consumer::handle这种写法叫做什么?
答:Java8的一个特性,即方法引用,可以简化代码量。当提及方法引用的时候,为了方便理解这个陌生的概念,因此简单介绍一个匿名方法内部类,lambda表达式。
1 不使用匿名方法内部类
这个例子应该是我们最为熟悉的写法:创建接口,实现实现类,调用实现类
interface Calculator {String showBrand(String brand);
}class BasicCalculator implements Calculator {@Overridepublic String showBrand(String brand) {return brand;}
}public class Main {public static void main(String[] args) {Calculator calculator = new BasicCalculator();String brand= calculator.showBrand("卡西欧");System.out.println("计算机品牌是: " + brand);}
}
2 改造为使用匿名方法内部类
接下来就让我们改造一下这块代码,使用匿名方法内部类试试
interface Calculator {String showBrand(String brand);
}public class Main {public static void main(String[] args) {// new一个接口Calculator calculator = new Calculator() {@Overridepublic String showBrand(String brand) {return brand;}};String brand = calculator.showBrand("卡西欧");System.out.println("计算机品牌是: " + brand);}
}
对比正常的写法可以发现,这样一改造,就不需要创建一个实现类了。
【具体的信息参考此文链接,点击查看】
3 改造为Lambda表达式
从理解上,匿名内部类的思想,确实让人有简化了代码的感觉,但从示例代码量上看,并没有减少很多。
那再使用Lambda表达式试试
3.1 第一种风格lambda
这一种风格是常用的,后面的都不习惯那样写,了解即可。
interface Calculator {String showBrand(String brand);
}public static void main(String[] args) {Calculator calculator = brand -> showBrand(brand);String name = calculator.showBrand("卡西欧");System.out.println("品牌打印: " + name);}
3.2 第二种风格lambda
interface Calculator {String showBrand(String brand);
}public class Main {public static void main(String[] args) {Calculator calculator = brand -> "Brand: " + brand;String name = calculator.showBrand("卡西欧");System.out.println("品牌打印: " + name);}
}
打印结果是:品牌打印:Brand:卡西欧
3.3 第三种风格lambda
那我不想要输出结果含有 Brand:,main方法的代码如下
public static void main(String[] args) {Calculator calculator = brand -> brand;String name = calculator.showBrand("卡西欧");System.out.println("品牌打印: " + name);}
打印结果:品牌打印:卡西欧
brand -> brand是什么,可以直接去掉吗?
答:箭头左边是参数。我们的参数是brand,这不能变动;箭头右边的是我们给参数赋予的值,看看下面的案例
3.4 第四种风格lambda
public static void main(String[] args) {Calculator calculator = brand -> "Iphone 14";String name = calculator.showBrand("卡西欧");System.out.println("品牌打印: " + name);}
打印结果是:品牌打印:Iphone 14
为什么会这样,是因为我们brand -> "Iphone 14"定义后,参数就写死了,后续calculator.showBrand("卡西欧")的参数 卡西欧失效了
接下来的这个案例,希望告诉大家方法引用的用法和用途。不要再继续关注如何简化代码,先看看怎么使用方法引用吧
4 改造为方法引用
interface Calculator {String showBrand(String brand);
}public class Main {public static String temp(String schoolName) {return schoolName;}public static void main(String[] args) {Calculator calculator = Main::tempSystem.out.println("品牌打印: " + calculator.showBrand("卡西欧"));}
}
结果输出
品牌打印: 卡西欧
Main::temp是什么意思?
答:类名::方法名,表示调用Main类下的temp方法
Calculator calculator = Main::temp是什么意思?
答:关联到Calculator接口或者类中
calculator.showBrand("卡西欧")是什么意思?
答案:表面上是在调用 Calculator 类中的 showBrand()方法,因为temp()已经绑定了Calculator类
所以会比对showBrand()方法和temp()的返回值类型:Sting、 参数个数:1 、 参数返回值类型:String
满足这些条件后,将会执行如下过程
首先,参数(卡西欧)传入 showBrand方法中
其次,参数(卡西欧)传入 temp方法中
然后, temp方法返回值是 (卡西欧)
最后,打印结果
这样有个什么好处呢,我们仅仅给showBrand(参数)传入参数,就实现了参数自动传给temp(参数),这就是自动传参的设计!
给
此时我们将这个案例修改为使用匿名方法内部类的样式
interface Calculator {String showBrand(String brand);
}public class Main {public static String temp(String schoolName) {return schoolName;}public static void main(String[] args) {Calculator calculator = new Calculator() {@Overridepublic String showBrand(String brand) {return temp(brand);}};System.out.println("品牌打印: " + calculator.showBrand("卡西欧"));}
}
通过本文,可以直观的感受很简单的应用方法引用的写法,下次在遇到时候,可以凭借此基础再理解企业代码如何写的。也可以当作优化自己的代码写法的思路。
相关文章:
匿名内部类、Lambda、方法引用 的总结
在今天的项目中看到这样一行代码 Integer syncCount consumer.consumerInfo( Collections.singletonList(KafkaTopicConst.Event_BMS_SYSLOG_ROLE),consumer::handle); 直接傻眼,无法理解consumer::handle这种用法,因此总结如下 consumer::handle这种写…...
本地docker registry 搭建
#!/bin/bash DOCKER_REGISTRY_ROOT/data0/docker/registry DOMAINexample.host.com #生成证书:https://goharbor.io/docs/2.6.0/install-config/configure-https/ mkdir $DOCKER_REGISTRY_ROOT/certs cd $DOCKER_REGISTRY_ROOT/certs openssl genrsa -out ca.key 40…...
阿里云将关停代销业务
我是卢松松,点点上面的头像,欢迎关注我哦! 阿里云自从逐渐分拆独立之后,做了很多调整。最近它又做了一个大动作:据DoNews消息,阿里云将会在今年9月30日之前,全面关停代销业务。 这件事实际上…...
【ES6】JavaScript的Proxy:理解并实现高级代理功能
在JavaScript中,Proxy是一种能够拦截对对象的读取、设置等操作的机制。它们提供了一种方式,可以在执行基本操作之前或之后,对这些操作进行自定义处理。这种功能在许多高级编程场景中非常有用,比如实现数据验证、日志记录、权限控制…...
[Pandas] 求百分比并添加百分(%)号
导入数据 import pandas as pddf pd.DataFrame(data{orders: [2130,5102,3256,1297,1918,786],repeat_orders: [73,158,89,30,49,18]}) df df[repetition_rate] df[repeat_orders] / df[orders] df df[repetition_rate] df[repetition_rate].apply(lambda x: format(x, .2…...
《算法竞赛·快冲300题》每日一题:“凑二十四”
《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 凑…...
git reset --hard HEAD
git reset --hard HEAD 是用于将你的工作目录重置回最后一次提交状态的命令。- git reset 是 git 的一个命令,用于重置你当前的 HEAD 到指定的状态。 --hard 标志告诉 git 要完全重置工作目录和暂存区,去匹配最后一次提交。在这个过程中,所有…...
机器人编程怎么入门?
机器人已经在我们中间存在了二三十年。如今,机器人在我们的文化中比以往任何时候都更加根深蒂固。大多数机器人机器用于各种装配线,或在世界各地的矿山或工业设施中执行密集的物理操作。 还有一些家用机器人,工程师正在对机器人进行编程&…...
广州华锐互动:VR垃圾分类虚拟科普系统让学习过程更加丰富有趣
在我们的日常生活中,垃圾分类已成为一项重要的公民责任。然而,由于缺乏对垃圾分类的深入理解和相关知识,许多人在实践中往往感到困惑和挫败。为了解决这个问题,一种创新的解决方案应运而生:垃圾分类VR虚拟仿真教学系统…...
手机盖板IR油墨透光率检测仪T03
手机盖板作为手机最外层玻璃面板,其加工一般有落料、倒边、抛光、镀膜、丝印等多道加工工序组成,其中任何一个工序出现差错,都有可能导致手机盖板产生缺陷,例如漏油、透光、IR孔不良、视窗划伤、油墨区划伤、內污、边花等…...
ChatGPT⼊门到精通(6):ChatGPT 提问设计
前⾔ 学会提问就是为了让AI给出⾼质量的答案。 你所学到的技能⼀切为了⽣成⾼质量的答案。 本教程适合:普通ChatGPT的⽤户、专业prompt⼯程师 你将收获:prompt 技巧的全⾯指导 、prompt⼯程师必备技能、prompt技术⼯程⾼质量答 案完全指南 提⽰词 Prom…...
如何使用 Tailwind CSS 设计高级自定义动画
使用Tailwind CSS掌握动画技术,为用户带来难忘的体验 开篇 动画已经成为网页设计的重要组成部分,使开发人员能够创建引人入胜和互动的用户体验。 Tailwind CSS,一款流行的实用型CSS框架,提供了一套强大的工具,可以轻松…...
【C语言】循环语句详解
✨个人主页: Anmia.🎉所属专栏: C Language 🎃操作环境: Visual Studio 2019 版本 目录 1.什么是循环结构? 2.while循环 while流程图 while语句中的break和continue break continue 3.for循环 for流…...
SpringBoot项目配置文件数据库用户名密码加密
1、需求 在使用SpringBoot开发过程中,会将一些敏感信息配置到SpringBoot项目的配置文件中(不考虑使用配置中心的情况 ),例如数据库的用户名和密码、Redis的密码等。为了保证敏感信息的安全,我们需要将此类数据进行加密配置。 2、操作步骤 …...
5个IT事件管理的最佳实践
什么是IT事件? IT事件是一个影响很大的紧急问题,通常会影响整个组织或其主要部分。重大事件几乎总是导致组织的服务变得不可用,这导致组织的业务受到打击,并最终影响其财务状况。以下是5个重大IT事件管理的最佳实践: …...
双核和双路服务器的区别
服务器术语里,大家经常会听到1U、2U,单路、双路,机架式、塔式及刀片式等常用名词。其中,机架式、塔式及刀片式是 指服务器的外形,U是指服务器的高度,路是指服务器的处理器数量。 部分朋友会问,我…...
学习JAVA打卡第四十七天
日期的格式化 程序可能希望按照某种习惯来输出时间。例如时间的顺序:年/月/日或年/月/日/时/分/秒。可以直接使用String类调用format方法对日期进行格式化。 Format方法 Format方法: format(格式化模式,日期列表) 按照“格式…...
Exploring Unreal Engine New Free Archviz Explorer Project 视频笔记
链接: https://www.bilibili.com/video/BV1Q34y1Z7he/ 场景中没有太阳,也没有定向光 该蓝图用来控制光线的显示 删除这个蓝图 添加这个蓝图 顶部会出现时间滑块 该项目还有扩展插件,用户可以自由下载 它是由一个8k的卫星图做的地形底图 …...
Python|爬虫和测试|selenium框架的安装和初步使用(一)
前言: Python作为一门胶水语言来说,可以说是十分的优秀,什么事情都可以干,并且在某些领域还能干的非常不错,尤其是在爬虫和测试领域,该语言可以说是没有对手。 这么说的原因是因为如果你要使用爬虫爬取某…...
SAP FI之定义财务年和财务年度变式(Fiscal Year Variants)
目录 前言 一、财务年度/财务年度变式 二、使用步骤 1.配置步骤 前言 本文主要介绍SAP会计年度和SAP会计年度变式。 一、财务年度/财务年度变式 财务年度可以具有与日历年相同的期间,也可以不同。中国财政年度从1月到12月,称为历年制,有…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
