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

理解lambda表达式

Lambda表达式:
这里不再过多叙述什么事lambda表达式,就说下怎么使用,首先和lambda表达式同时存在的就是另一个定义,就是匿名内部类。匿名内部类首先需要一个接口。
下面用一个例子说明lambda表达式:

public class HelloWorld{public static void main(String[] args){String name = "cat";Animal cat = new Animal(name, ()->{System.out.println("Hello, I'm a " + name + "!");});}public static interface Talk {void talks();}public static class  Animal {public String name ;public Animal(String names, Talk talks) {this.name = names;talks.talks();}}
}

这里的接口就是Talk,该接口只是申明了一个功能,talks; 但是至于这个方法的实现就是lambda表达式的精髓所在,这个方法的具体实现,我们可以放在使用这个方法的时候再去实现。
如上所述代码,该方法是在初始化Animal对象的时候才实现的,这就和以往的方法不同,以往都是先定义方法的函数体,然后再使用。这里反而是到使用的时候再定义,这不就可以根据我们的场景来定义方法的功能了嘛。
这就是可以实现,根据不同场景采用不同策略应对的功能。 比如导师给你安排个任务,然后告诉你说有困难你再去找XX师兄师姐。 这里就是一个场景加一个方法的组合,场景是有困难,然后方法时去找师兄师姐,但是场景很多啊,你可能刚上手就不会,也可能是做到一半遇到问题,亦或者是做到最后一步,不知道怎么总结,那你请教的内容必然也不会相同。所以会根据场景确定问题。这里场景就是一个对象(Animal),实例化一个场景,然后根据场景实现请教这个接口中的详细方法(talk)。
这就是我理解的lambda表达式最直观的一个使用场景,当然这里完全可以用匿名内部类解决,上面的初始化方法换成如下即可。

Animal dog = new Animal(name,  new Talk() {@Overridepublic void talks(){System.out.println("Hello, I'm a " + name + "!");}});

Lambda表达式只是简化了这里的表达形式,这里可以这么理解,

Talk talks = new Talk() {@Overridepublic void talks(){System.out.println("Hello, I'm a " + name + "!");}};

然后这里的就是直接将等号左边当成了参数放入初始化函数中。而lambda表达式就是在这个基础上再次简化,可以写成下面的格式:

(参数) -> {方法体;}

这里的talks方法是无参函数,所以就直接传一个 () 再加上符号 -> 然后通过{}将方法体包含住,所以在看到lambda表达式的时候,如果还不熟悉,不理解其含义,可以先将其逆转为匿名内部类,这样就会好理解很多。

下面就在Android代码中找一个例子:

private final Comparator<WindowState> mWindowComparator =(WindowState newWindow, WindowState existingWindow) -> {final WindowToken token = WindowToken.this;if (newWindow.mToken != token) {throw new IllegalArgumentException("newWindow=" + newWindow+ " is not a child of token=" + token);}if (existingWindow.mToken != token) {throw new IllegalArgumentException("existingWindow=" + existingWindow+ " is not a child of token=" + token);}return isFirstChildWindowGreaterThanSecond(newWindow, existingWindow) ? 1 : -1;
};

就找到之前Window相关内容中的排序算法作为例子,这里的mWindowComparator是一个泛型为WindowState的Comparator,然后初始化的时候看到了等号邮编就是一个lambda表达式。
这个lambda表达式参数列表为(WindowState, WindowState),这两个WindowState分别是待比较的两个量,再看后面的方法体,即{}中包含的地方,首先是确认newWindow是不是和队列中的WindowState属于同一个聚类(即mToken属性相同),再确认待比较的exitingWindowstate是否是同一个聚类,然后再调用isFirstChildWindowGreaterThanSecond()方法进行比较。那这里怎么理解呢?
首先匿名内部类,要找到一个接口,接口很好找,就是需要实现方法体的那个东西,所以这里就是Comparator,看定义,确实是一个接口。
那重写成匿名内部类就是下面的模式:

Comparator<WindowState> mWindowComparator = new Comparator<WindowState>() { @Overrideint compare(WindowState newWindow,WindowState existingWindow ){return isFirstChildWindowGreaterThanSecond(newWindow, existingWindow) ? 1 : -1;}};

这样就比较好理解lambda表达式了,他就是重写了这个compare方法而已。所以遇到不是很好理解的lambda表达式,就先还原成匿名内部类形式,这样就能方便理解一点,等熟悉后其实也不用这么麻烦了,一般都能直接看明白

不过之前还遇到一个比较奇怪的lambda表达式形式,不太常见,就是 :: 这个符号。双冒号在c++中遇到的多一点,可代表某个某个域的函数或类型,在lambda表达式中好像也差不多,在Android代码中就有用到这个功能:

private final Comparator<WindowToken> mWindowComparator =Comparator.comparingInt(WindowToken::getWindowLayerFromType);

这里就代表着调用了WindowToken这个类中的getWindowLayerFromType方法。

相关文章:

理解lambda表达式

Lambda表达式&#xff1a; 这里不再过多叙述什么事lambda表达式&#xff0c;就说下怎么使用&#xff0c;首先和lambda表达式同时存在的就是另一个定义&#xff0c;就是匿名内部类。匿名内部类首先需要一个接口。 下面用一个例子说明lambda表达式&#xff1a; public class Hel…...

【面试】Java的前端编译器和后端编译器

目录 1. 说明2. 前端编译器2.1 主要功能2.2 工作原理 3. 后端编译器3.1 主要功能3.2 工作原理 1. 说明 1.在Java的编译过程中&#xff0c;编译器通常被划分为前端编译器和后端编译器&#xff0c;各自负责不同的任务。2.前端编译器主要负责源代码的词法分析、语法分析和语义检查…...

教育小程序的性能优化:从前端到后端的综合提升策略

随着教育小程序的普及&#xff0c;其性能直接影响用户体验和教学效果。本文将从前端到后端&#xff0c;详细探讨教育小程序的性能优化策略&#xff0c;帮助开发者打造高效、流畅的教育应用。 一、前端性能优化策略 代码优化 减少HTTP请求&#xff1a;合并CSS、JavaScript文件…...

单链表实现通讯录

之前我们完成了基于顺序表&#xff08;动态&#xff09;实现通讯录&#xff0c;现在我们链表学完了&#xff0c;可以尝试着使用链表来实现我们的通讯录。 首先我们要明白我们写的通讯录是由一个个节点组成的&#xff0c;每个节点里存储的就是我们的联系人信息。也就是说 我们需…...

Linux 命令操作技巧

Linux命令行界面提供了丰富的快捷键来提高操作效率&#xff0c;以下是一些常用的Linux终端快捷键&#xff0c;主要基于Bash shell&#xff1a; Tab - 自动补全&#xff1a;输入命令、文件名、目录名或命令选项的开头部分&#xff0c;然后按Tab键&#xff0c;系统会自动补全剩余…...

深度学习21天 —— 卷积神经网络(CNN):识别验证码( 第12天)

目录 一、前期准备 1.1 标签数字化 1.2 加载数据 1.3 配置数据 二、其他 2.1 损失函数 categorical_crossentropy 2.2 plt.legend(loc ) 2.3 history.history 活动地址&#xff1a;CSDN21天学习挑战赛 学习&#xff1a;深度学习100例-卷积神经网络&#xff08;CNN&…...

利用 Docker 简化Redis部署:快速搭建Redis服务

利用 Docker 简化Redis部署&#xff1a;快速搭建Redis服务 目录 利用 Docker 简化Redis部署&#xff1a;快速搭建Redis服务为什么选择 Docker准备工作拉取Redis镜像快速运行Redis容器验证Redis服务总结 在现代软件开发中&#xff0c;Redis作为一种高性能的键值数据库&#xff0…...

Web前端框架:深入探索与实践

Web前端框架&#xff1a;深入探索与实践 在当下数字化飞速发展的时代&#xff0c;Web前端框架的选择与应用成为了开发者们关注的焦点。Node.js&#xff0c;作为一种强大的后端技术&#xff0c;在前端框架的构建中也发挥着不可或缺的作用。本文将围绕Node.js Web前端框架&#…...

【算法】贪心算法——柠檬水找零

题解&#xff1a;柠檬水找零(贪心算法) 目录 1.题目2.题解3.参考代码4.证明5.总结 1.题目 题目链接&#xff1a;LINK 2.题解 分情况讨论 贪心算法 当顾客为5元时&#xff0c;收下当顾客为10元时&#xff0c;收下10元并找回5元当顾客为20元时&#xff0c;收下20元并找回10…...

Jmeter安装教程

1 Jmeter下载 Jmeter下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi&#xff0c;选择需要的版本点击下载 解压jmeter安装包 解压后的安装包如下&#xff1a; 2 配置Jmeter环境变量 进入环境变量配置页面&#xff1a;计算机->属性->高级系统设置-&…...

关于磁盘管理

磁盘管理是操作系统提供的一项功能&#xff0c;用于高效地组织、维护和控制计算机的硬盘驱动器及其卷&#xff08;分区&#xff09;。通过磁盘管理工具&#xff0c;用户和管理员可以执行多种与存储相关的高级任务&#xff0c;主要包括&#xff1a; 初始化新磁盘&#xff1a; …...

人大金仓数据库大小写不敏感确认

1、图形化确认(管理—其他选项—预设选项) 2、命令行确认 # ksql -p 54321 -U system test # show enable_ci; 查看是否大小写敏感&#xff0c;on表示大小敏感&#xff0c;off表示大小写不敏感&#xff0c;使用某些项目的时候&#xff0c;需要设置数据库大小写不敏感&#…...

【Java】还有人不懂继承?25 个 Case 包教包会

还有人不懂继承&#xff1f;25 个 Case 包教包会 1.Implement single inheritance2.Implement multilevel inheritance3.Implement hierarchical inheritance4.Override a base class method into a derived class5.Demonstrate the protected access specifier6.Create an Stu…...

Qt实现窗口失去焦点抖动功能

一、失去焦点检测 当窗口失去焦点时会发出FocusOut事件&#xff0c;具体实现如下&#xff1a; 首先给窗口安装事件过滤器&#xff1a; this->installEventFilter(this);然后在事件过滤器函数中判断有没有失去焦点 bool MessageDialog::eventFilter(QObject *object, QEve…...

Flink 数据源

原理 在 Flink 中&#xff0c;数据源&#xff08;Source&#xff09;是其中一个核心组件&#xff0c;负责从各种来源读取数据供 Flink 程序处理。 Flink 的数据源类型丰富&#xff0c;涵盖了从简单测试到生产环境使用的各种场景。Kafka、Socket、文件和集合是 Flink 中最常见…...

在本地电脑中如何用命令操作远程服务器上的数据库

日常做服务器维护&#xff0c;经常操作的2个事情&#xff0c;一个是备份远程服务器上的数据库到本地电脑&#xff0c;一个是将备份下来的数据库是恢复到本机做测试用。下面以阿里云的mysql为例&#xff0c;看看怎么弄。电脑是win10系统&#xff0c;先打开cmd命令行模式&#xf…...

uniApp子组件监听数据的变化的方法之一

props:{//用来接收外界传递过来的数据swiperList:{type:Array,default:[]}}, swiperList&#xff1a;是父组件传递过来的值 通过 watch 监听&#xff08;在父组件中也同样可以使用&#xff0c;跟VUE的监听数据变化同理&#xff09; watch:{//监听组件中的数据变化swiperList(ol…...

Python容器化技术的15个Docker实践

今天&#xff0c;我们将一起探索如何利用Docker这一强大的容器化工具&#xff0c;来提升你的Python项目开发、部署效率。通过一系列由浅入深的实践案例&#xff0c;你将学会如何将Python应用装入“小盒子”&#xff0c;让它在任何地方都能轻松运行。 1. Docker入门&#xff1a…...

QT天气预报项目(写在简历上)

一、ui设计 实现功能:可以搜索不同的城市进行天气的查询,并且显示未来7天内的天气,并绘制出当天的最高气温和最低气温曲线图。 学到的知识: stylesheet界面美化 Json数据解析 HTTP通信get请求 使用事件过滤器绘制温度曲线 多控件处理(利用数组) 代码整合调试能力 二…...

从零到一建设数据中台 - 数据可视化

从零到一建设数据中台(八)- 数据可视化 一、数据可视化大屏 数据可视化是借助于图形化手段,清晰有效地传达与沟通信息。 将一些业务的关键指标通过数据可视化的方式展示到一块或多块LED大屏上,以大屏为主要展示载体的数据可视化设计。 在数据可视化大屏构建过程中,为了…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...