Android Java 中Lambda 表达式

学习笔记 

在 Java 和 Android 中,除了你提到的 setOnClickListener() 使用 Lambda 表达式和匿名类的写法,还有许多类似的场景可以通过 Lambda 表达式来简化代码。以下是一些常见的类似用法以及它们如何通过 Lambda 表达式和匿名类实现。

 1. setOnClickListener 和 View.OnClickListener


你已经提到的 setOnClickListener 是一个典型的例子。这里的 View.OnClickListener 接口只有一个 onClick(View v) 方法。

 匿名类(传统方式):

button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理点击事件}
});


 Lambda 表达式:

button.setOnClickListener(v -> {// 处理点击事件
});


 2. setOnItemClickListener 和 AdapterView.OnItemClickListener


在 ListView 或 GridView 中,我们常常会用到 setOnItemClickListener 来设置项目点击事件监听器。

 匿名类(传统方式):

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// 处理项目点击事件}
});


 Lambda 表达式:

listView.setOnItemClickListener((parent, view, position, id) -> {// 处理项目点击事件
});


 3. setTextChangedListener 和 TextWatcher


TextWatcher 监听文本框内容变化,通常用于 EditText 等输入框。 匿名类(传统方式):

editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// 文本变化前}@Overridepublic void onTextChanged(CharSequence charSequence, int start, int before, int count) {// 文本变化中}@Overridepublic void afterTextChanged(Editable editable) {// 文本变化后}
});


 Lambda 表达式(使用默认方法和接口):
如果我们不需要实现所有的方法,可以通过 Lambda 表达式简化:

editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// 实现前置操作}
});

如果某些方法不需要实现,可以选择重写只有一个方法的接口。 但对于 TextWatcher 这种需要重写多个方法的接口,Lambda 表达式的简化效果较小。

 4. setOnCheckedChangeListener 和 CompoundButton.OnCheckedChangeListener
常用于 CheckBox、RadioButton 等组件来监听勾选状态的变化。

 匿名类(传统方式):

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// 处理勾选变化}
});


 Lambda 表达式:

checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {// 处理勾选变化
});


 5. setOnLongClickListener 和 View.OnLongClickListener
常用于设置长按事件的监听器。

 匿名类(传统方式):

view.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {// 处理长按事件return true;}
});


 Lambda 表达式:

view.setOnLongClickListener(v -> {// 处理长按事件return true;
});


 6. addTextChangedListener 和 TextWatcher
监听文本框文本变化的过程,通常用于 EditText。 匿名类(传统方式):

editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// Text changed}@Overridepublic void onTextChanged(CharSequence charSequence, int start, int before, int count) {// Text changed}@Overridepublic void afterTextChanged(Editable editable) {// Text changed}
});


 Lambda 表达式(简化):

editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// Text changed}
});

 7. setOnTouchListener 和 View.OnTouchListener
如果你需要捕捉视图的触摸事件,可以使用 setOnTouchListener。

 匿名类(传统方式):

view.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 处理触摸事件return false;}
});


 Lambda 表达式:

view.setOnTouchListener((v, event) -> {// 处理触摸事件return false;
});


---

 8. setOnItemSelectedListener 和 AdapterView.OnItemSelectedListener


这是 Spinner、GridView 等控件中常用的接口,用于监听项的选择事件。 匿名类(传统方式):

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {// 处理项选择事件}@Overridepublic void onNothingSelected(AdapterView<?> parent) {// 处理没有项选择事件}
});


Lambda 表达式:

spinner.setOnItemSelectedListener((parent, view, position, id) -> {// 处理项选择事件
});


 总结

Lambda 表达式在 Java 8 中的引入使得代码更加简洁,尤其是在 Android 中使用监听器(如 OnClickListener、OnCheckedChangeListener 等)时,能够减少冗长的匿名类代码,提高代码的可读性。匿名类依然是兼容所有 Android 版本的通用写法,但如果你的应用运行在支持 Java 8 的设备上,使用 Lambda 表达式是推荐的方式。

常见的适用 Lambda 表达式的场景包括:

- OnClickListener
- OnItemClickListener
- OnCheckedChangeListener
- OnLongClickListener
- OnTouchListener
- TextWatcher
- OnItemSelectedListener

通过使用 Lambda 表达式,可以使得代码更简洁、易于维护。

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

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

相关文章

Android 文件分段上传和下载方案

一、背景 Android 中的大文件下载需要使用分段下载&#xff0c;下载通常是在线程中进行的&#xff0c;假如有5段&#xff0c;那同时5个线程去执行下载&#xff0c;请求http返回文件流后&#xff0c;需要将多个文件流同时写进同一个文件&#xff0c;这里用到 RandomAccessFile…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头最大的人工岛找出知晓秘密的所有专家 建图及其拓扑排序篇链式前向星建图板子课程表 本节设置的意义 主要就是为了复习…

易语言学习-cnblog

易语言数据类型 数值转换命令&#xff08;自己学&#xff09; 数值到大写&#xff08;&#xff09;将一个数值转换到中文读法&#xff0c;第二个参数为是否为简体。 数值到大写&#xff08;123.44&#xff0c;假&#xff09; 猜测结果 数值到金额&#xff08;&#xff09;将双…

atob()为啥明明表示base64toASCII却叫atob?(2)

上篇谈到JavaScript中的atob()函数实际是表示ASCII to binary而非ASCII to base64&#xff0c;那既然函数底层产生的是二进制内容&#xff0c;那为什么咱们在JavaScript环境中通过atob()解码可以直接得到字符串&#xff1f;答案下文揭晓ෆ( ˶ᵕ˶)ෆ 在JavaScript中&#x…

树莓派的开机自启

前言 很多比赛你的装置是不能动的,就是你直接拿上去,不允许用电脑启动. 树莓派开机自启的三种方式 1,快捷方式自启动 就是在我们用户的目录下(他这里是/home/pi,我的是/home/zw),ctrlh可以显示隐藏文件价, #没有就找你自己的用户目录 cd /.config#在这里面建一个autostart文…

Day10_CSS过度动画

Day10_CSS过度动画 背景 : PC和APP项目我们已经开发完毕, 但是再真正开发的时候有些有些简易的动态效果我们可以使用CSS完成 ; 本节课我们来使用CSS完成基础的动画效果 今日学习目标 CSS3过度CSS3平面动态效果CSS3动画效果案例 1. CSS3过渡 ​ 含义 :过渡指的是元素从一种…

vue3-基于element-plus实现定制化动态表单及校验

基础版 这里不会对表单进行封装处理 <template><div style="margin: 0 auto; width: 1200px"><el-formref="formRef"style="max-width: 600px; margin-top: 20px":model="dynamicValidateForm"label-width="auto…

go语言闭包捕获的是变量的引用而不是变量的值

在 Go 语言中&#xff0c;闭包捕获的是变量的引用&#xff0c;而不是变量的值。这意味着闭包会引用循环变量或外部变量的实际内存位置&#xff0c;而不是在闭包创建时复制变量的值。这种行为有时会导致意外的结果&#xff0c;尤其是在循环中创建多个闭包时。 闭包捕获变量的引…

操作系统进程和线程——针对实习面试

目录 操作系统进程和线程什么是进程和线程&#xff1f;进程和线程的区别&#xff1f;进程有哪些状态&#xff1f;什么是线程安全&#xff1f;如何实现线程安全&#xff1f;什么是线程安全&#xff1f;如何实现线程安全&#xff1f; 进程间的通信有哪几种方式&#xff1f;什么是…

Vue3中的祖孙组件通信——provideinject

在 Vue 3 中&#xff0c;provide 和 inject 是一对用于依赖注入的 API&#xff0c;可以在组件树中共享数据或功能&#xff0c;而无需通过 props 明确传递或使用事件进行通信。这对于管理共享状态、配置或服务特别有用。 provide 和 inject 的工作原理 provide&#xff1a;在父…

MyBatis——#{} 和 ${} 的区别和动态 SQL

1. #{} 和 ${} 的区别 为了方便&#xff0c;接下来使用注解方式来演示&#xff1a; #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用&#xff0c;而 ${} 是直接进行参数替换&#xff0c;这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时&#xff…

图像处理 之 凸包和最小外围轮廓生成

“ 最小包围轮廓之美” 一起来欣赏图形之美~ 1.原始图片 男人牵着机器狗 2.轮廓提取 轮廓提取 3.最小包围轮廓 最小包围轮廓 4.凸包 凸包 5.凸包和最小包围轮廓的合照 凸包和最小包围轮廓的合照 上述图片中凸包、最小外围轮廓效果为作者实现算法生成。 图形几何之美系列&#…

美畅物联丨智能分析,安全管控:视频汇聚平台助力智慧工地建设

随着科技的持续发展&#xff0c;建筑行业正朝着智能化的方向迅猛迈进。智慧工地作为建筑行业智能化的关键体现形式&#xff0c;借助各类先进技术来提升工地的管理效率、安全性以及生产效益。在这个过程中&#xff0c;视频汇聚平台发挥着极为重要的作用。以畅联AIoT开放云平台为…

2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解

C&#xff1a;宠物行业及相关产业的发展分析与战略 随着人们消费观念的发展&#xff0c;宠物行业作为一个新兴产业&#xff0c;正在全球范围内逐渐积聚势头&#xff0c;这得益于快速的经济发展和人均收入的提高。1992年&#xff0c;中国小动物保护协会成立&#xff0c;随后1993…

React-自定义Hook与逻辑共享

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 在 React 中&#xff0c;自定义 Hook 是一种复用逻辑的方式。自定义 Hook 是一个 JavaScript 函数&#xff0c;名称以 use 开头&#xff0c;可以调用其他的 Hook, 可以返回任意值。 创建自定义Hook 假设你正在开发一款重…

设计模式学习[8]---原型模式

文章目录 前言1.原理阐述2.举例 总结 前言 这个设计模式第一次听到&#xff0c;以为有点类似于软件工程中的一个开发模式&#xff0c;原型化开发模式。 原型化开发是软件开发的一种常用方法。开发人员对用户提出的问题进行总结&#xff0c;就系统的主要需求取得一致意见后&am…

安装spark

spark依赖java和scale。所以先安装java&#xff0c;再安装scale&#xff0c;再是spark。 总体教程跟着这个链接 我跟着这个教程走安装java链接&#xff0c;但是有一些不同&#xff0c;原教程有一些错误&#xff0c;在环境变量设置的地方。 java 首先下载jdk。 先看自己的环境…

MACOS开发、使用常见问题汇总

MACOS常见问题 本文记录使用macos遇到的常见问题&#xff0c;后面会持续更新&#xff0c;觉得有用的可以收藏一下。 打不开xxx.app&#xff0c;因为它来自身份不明的开发者解决方法(开启任何来源) 打开终端&#xff08;Terminal&#xff09;程序 拷贝sudo spctl --master-di…

【MySQL实战45讲笔记】基础篇——深入浅出索引(上)

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 基础篇——事务隔离 目录 系列文章深入浅出索引&#xff08;上&#xff09;4.1 索引的常见模型4.2 InnoDB 的索引模型4.3 索引维护4.4 思考&#xff1a;为什么要重建索引以及如何做&#xff1f; 深入浅出索…

深入理解电子邮件安全:SPF、DKIM 和 DMARC 完全指南

引言 在当今数字时代&#xff0c;电子邮件已经成为我们日常通信中不可或缺的一部分。然而&#xff0c;随之而来的安全问题也日益突出。邮件欺诈、钓鱼攻击和垃圾邮件等威胁不断增加&#xff0c;这促使了多种邮件安全验证机制的出现。本文将深入探讨三个最重要的邮件安全协议&a…