第一步:初学者代码 (没有 Lambda 的“旧”方法)

假设我们有一个简单的需求:执行一个耗时的计算(比如网络请求),并在计算完成后,通过一个“回调”来通知我们结果。

1. 定义一个回调接口

这个接口只有一个方法,用来在任务完成时被调用。

// 定义一个计算完成的回调接口
interface OnCalculationCompleteListener {// 当计算完成时,会调用这个方法,并传入结果void onComplete(int result);
}

2. 创建一个使用回调的方法

这个方法接收两个数字和一个回调接口的实例。它会模拟一个耗时操作,然后在操作完成后调用回调。

class Calculator {// 模拟一个异步加法,完成后通过 listener 通知结果public void addAsync(int a, int b, OnCalculationCompleteListener listener) {System.out.println("开始计算...");// 模拟耗时操作,比如一个网络请求new Thread(() -> {try {Thread.sleep(2000); // 暂停2秒int sum = a + b;// 计算完成,调用传入的 listener 的 onComplete 方法listener.onComplete(sum);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}

3. 调用方法 (使用匿名内部类)

在没有 Lambda 表达式的时代,我们通常会像下面这样使用“匿名内部类”来实现接口。

public class Main {public static void main(String[] args) {Calculator calculator = new Calculator();// 调用异步加法,并传入一个回调的实现calculator.addAsync(10, 5, new OnCalculationCompleteListener() {@Overridepublic void onComplete(int result) {// 这部分代码会在2秒后执行System.out.println("计算完成!结果是: " + result);}});System.out.println("主线程继续执行其他任务...");}
}

代码解释:

  • new OnCalculationCompleteListener() { ... } 这部分就是匿名内部类。
  • 我们为了使用 addAsync 方法,必须给它传递一个 OnCalculationCompleteListener 的实例。
  • 这个实例需要实现 onComplete 方法。这部分代码就是我们希望在计算完成后执行的逻辑。
  • 这种写法很冗长,有很多模板化的代码(比如 new ...(), @Override, public void onComplete(...)),而我们真正关心的只有花括号 {} 里的那一行代码。

第二步:使用 Lambda 表达式改造

Lambda 表达式就是为了简化上面这种冗长的写法的。Java 编译器知道 addAsync 方法需要一个 OnCalculationCompleteListener,并且这个接口只有一个方法 onComplete(int result)。所以,很多信息都可以省略。

使用 Lambda 的写法如下:

public class Main {public static void main(String[] args) {Calculator calculator = new Calculator();// 使用 Lambda 表达式来传递回调calculator.addAsync(10, 5, (result) -> {System.out.println("Lambda 计算完成!结果是: " + result);});System.out.println("主线程继续执行其他任务...");}
}

语法格式讲解:

(result) -> { System.out.println("..."); }

  • (result):这对应于接口方法 onComplete(int result) 的参数列表。因为编译器知道上下文,所以参数类型 int 都可以省略。
  • ->:这是 Lambda 运算符,读作 “goes to”,用来分隔参数和方法体。
  • { ... }:这是方法体,也就是具体要执行的代码。如果只有一行代码,甚至可以省略花括号 {}

你看,Lambda 表达式把一个复杂匿名类的实现,简化成了一行清晰的代码,完美地传递了“当任务完成后,带着result参数,执行这段代码”的核心思想。


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

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

相关文章

JMeter中变量如何使用?

在性能测试的世界中,Apache JMeter是一把利器,凭借其强大的可扩展性与图形化操作界面,在工业界和开源社区中广受青睐。而“变量的使用”作为JMeter中提高测试灵活性、可维护性和复用性的关键技术点,却常常被初学者忽略或误用。本文…

印度和澳洲的地理因素

研究表明,气温每升高1℃,劳动生产率可能下降1.5%至3%,甚至更多。印度大部分地区夏季高温且湿度较大,有地方60多度,严重限制了劳动效率和农业产出。若印度整体地理位置北移约300公里,平均气温将降低&#xf…

3D Gaussian Splatting

3D高斯溅射(3D Gaussian Splatting )是一种基于显式三维高斯分布的场景表示与渲染方法。与传统的三维重建技术(如多边形网格、点云或隐式神经辐射场NeRF)不同,3DGS将场景表示为大量带有属性的3D高斯椭球的集合&#xf…

鸿蒙5:布局组件

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

Flink状态和容错-基础篇

1. 概念 flink的状态和容错绕不开3个概念,state backends和checkpoint、savepoint。本文重心即搞清楚这3部分内容。 容错机制是基于在状态快照的一种恢复方式。但是状态和容错要分开来看。 什么是状态,为什么需要状态? 流计算和批计算在数…

【若依学习记录】RuoYi后台手册——分页实现

目录 若依系统简介 前端调用实现 前端调用举例 后台逻辑实现 若依系统简介 RuoYi 是一个基于 Spring Boot、Apache Shiro、MyBatis 和 Thymeleaf 的后台管理系统,旨在降低技术难度,助力开发者聚焦业务核心,从而节省人力成本、缩短项目周…

从台式电脑硬件架构看前后端分离开发模式

在软件开发领域,前后端分离早已成为主流架构设计理念。它将系统的业务逻辑处理与用户界面展示解耦,提升开发效率与系统可维护性。有趣的是,我们日常生活中常见的台式电脑硬件架构,竟与这一理念有着异曲同工之妙。今天,就让我们从台式电脑的硬件组成出发,深入探讨其与前后…

可观测性的哲学

在现代系统架构中,“可观测性(Observability)”已不仅仅是一个工程实践,是一种关于“理解世界”的哲学姿态, 还是一种帮助架构演变的认知工具。从柏拉图的“洞穴寓言”出发,我们可以构建起一条从被动接受投影&#xff…

开疆智能CCLinkIE转ModbusTCP网关连接傲博机器人配置案例

本案例是通过CClinkIE转ModbusTCP网关,连接傲博机器人的配置案例 PLC配置 打开三菱PLC组态软件GXWORK3设置CClinkIE一侧的参数配置,首先设置PLC的IP地址 双击详细设置进入CClinkIE配置 添加通用从站IP地址以及占用点数 设置好分配的软元件,确…

Bash Shellshock

CVE-2014-6271(Bash Shellshock远程命令注入漏洞) 该服务启动后有路径http://your-ip:port/victim.cgi和http://your-ip:port/safe.cgi。其中safe.cgi是新版页面,victim是bash4.3生成的页面。 漏洞位置在User-Agent中victim.cgi: User-Agent: () { foo; }; echo C…

以软件系统开发为例,解释PMO 与IPD、CMMI、项目管理什么区别和联系

以「开发一套智能仓储管理系统(WMS)」为例,拆解软件项目经理视角下的IPD、CMMI、项目管理和PMO如何协同运作: 场景设定 项目目标:6个月内交付WMS系统,支持日均10万订单处理关键角色: 你&#x…

TDengine 3.3.5.0 新功能 —— 查看库文件占用空间、压缩率

1. 背景 TDengine 之前版本一直没有通过 SQL 命令查看数据库占用的磁盘空间大小,从 3.3.5.0 开始,增加了这个方便且实用的小功能,这里详细介绍下。 2. SQL 基本语法 select expr from information_schema.ins_disk_usage [where condtion]…

蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体

蚂蚁百宝箱作为站式智能体应用开发平台,致力于为AI开发者提供简单、高效、快捷的智能体创作体验。作为业内领先的AI应用开发平台,开发者可以根据自身的个性化需求,基于各式各样的大模型来创建一个属于自己的智能体应用。 蚂蚁百宝箱&#xf…

AI助力JMeter—从静态参数化到智能动态化的进化之路

Apache JMeter作为开源利器被广泛应用于Web系统、API接口、数据库及消息队列等多场景性能验证。而“变量的使用”作为测试脚本灵活性和可维护性的核心手段,决定了脚本的复用性、可扩展性和数据驱动能力。传统的变量管理手段已难以应对大规模复杂测试任务中“动态化、…

第十六届蓝桥杯C/C++程序设计研究生组国赛 国二

应该是最后一次参加蓝桥杯比赛了,很遗憾,还是没有拿到国一。 大二第一次参加蓝桥杯,印象最深刻的是居然不知道1s是1000ms,花了很多时间在这题,后面节奏都乱了,抗压能力也不行,身体也不适。最后…

OpenCV计算机视觉实战(12)——图像金字塔与特征缩放

OpenCV计算机视觉实战(12)——图像金字塔与特征缩放 0. 前言1. 高斯金字塔1.1 应用场景1.2 实现过程 2. 拉普拉斯金字塔2.1 应用场景2.2 实现过程 3. 图像融合实例3.1 应用场景3.2 实现过程 小结系列链接 0. 前言 图像金字塔技术通过对原始图像按不同分…

【案例】基于Python的生源数据可视化分析:从Excel处理到动态地图展示

文章目录 需求分析技术要点程序流程一些细节核心代码表格的一些操作 心得体会代码汇总 需求分析 请设计一个程序,要求能够统计分析分散在不同表格中的数万条信息,以信息中的身份证号码或生源地代码字段为目标字段,统计每一年全国各省份及本省…

设计模式 | 原型模式

原型模式通过克隆机制实现对象高效创建,是性能敏感场景的利器。本文结合C示例详解实现原理、深拷贝陷阱、应用场景,并与工厂模式对比分析。 为何需要原型模式? 当遇到以下场景时,传统构造方法面临挑战: 创建成本高&am…

Go 语言中的单元测试

1、如何编写单元测试 在任何生产级别的项目开发中,单元测试都扮演着至关重要的角色。尽管许多初创项目在早期可能忽略了它,但随着项目逐渐成熟并成为核心业务,为其编写健壮的单元测试是保障代码质量和项目稳定性的必然选择。本文将带您快速掌…

8. 接口专业测试报告生成pytest-html

pytest-html 终极指南:打造专业级接口测试报告 在接口自动化测试中,清晰的测试报告是质量保障的关键。本文将深入解析如何通过pytest-html插件生成专业级测试报告。 一、核心安装与基础使用 快速安装(国内镜像) pip install -i …