当前位置: 首页 > news >正文

匿名内部类、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孔不良、视窗划伤、油墨区划伤、內污、边花等&#xf…...

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月,称为历年制,有…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...