匿名内部类、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月,称为历年制,有…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
