Lambda表达式的使用

2023-05-16

对于jdk1.8其实并不是那么熟悉,但是要学习这一点,对以后工作有好处,接下来开始学习jdk1.8在Android studio的配置以及lambda表达式的使用吧。

Lambda表达式

jdk1.8中新增的核心特性有lambda表达式,函数式接口,流API,默认方法,新的Date,以及Time API。详细介绍请看这里: Java 8简明教程 。

下面给大家介绍的是Lambda表达式,该表达式允许我们把行为传到函数里。之前把行为传到函数里我们采用的是匿名内部类,该方法导致行为最重要的方法夹杂在中间,不够突出,详见举例中代码。

lambda表达式取代了匿名内部类,取消了模板,允许程序猿用函数式风格编写代码,使代码可读性更高,尽管刚开始你会看不懂,但是你应该尝试,毕竟这是新的东西,我已从中获益。

格式

基本格式是:() -> {}

有下面三种具体表达:

  1. (params) -> expression
  2. (params) -> statement
  3. (params) -> {statement}

这个新的特性是激动人心的,那么有个问题,怎么用,是啊,很多东西我们都懂,但为什么还是过不好这一生,说远了,问题的关键是:用,得用,你还得会用。

lambda使用举例

as里的配置

要使用lambda,首先必须配置编译环境,这里使用的android studio,as默认的jdk版本是1.6,修改成1.8即可使用,这里确保你系统安装了jdk1.8,否则需要用到下面插件: gradle-retrolambda

as里的配置有两种方法:

配置gradle脚本

在build.gradle脚本中添加下列代码:


android {
   compileOptions {
       sourceCompatibility 1.8
       targetCompatibility 1.8
   }
}
  

当然写成下面的样子也是可以的


android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
}
  

设置项目结构

按快捷键Ctrl+Shift+Alt+S进入项目结构设置,把app的jdk版本修改成1.8,注意你需要填写1.8,因为那个下拉菜单里没有这一选项,如下:

这里采用的是第二种方法,然后项目自动同步。

同步后是会在build.gradle脚本下生成和上面一样的东东:

举例

点击按钮触发事件

传统的点击事件,应用匿名内部类:

Button button = (Button) findViewById(R.id.btn_insert);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show();
        }
    });

通过上面设置jdk版本为1.8后,鼠标放到new View.OnClickListener()里会有下面提示:

然后我们按快捷键Alt+Enter,是这样的

继续回车后,见证奇迹的时刻到来lo。。。

使用lambda表达式之后是这样的


Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());
  

一行代码就搞定了,清晰可见,把行为传到了函数里,这里注意v不可省略,是函数onClick的参数,当然就可以是任意名字,我还是建议就用一个字母表示,简单嘛,当然了首先你得知道她的意思,尽管她的很多行为你始终不会明白,哈哈。

实现Runnable接口

传统实现Runnable接口是这样的:

new Thread(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", "haha");
    }
}).start();

使用lambda表达式之后是这样的:


new Thread(() -> {
    Log.i("TAG", "haha");
}).start();
  

哇哦,是不是有种很清爽的感觉,乍一看,这是什么鬼,仔细分析后是用了lambda表达式() -> {},哈哈,简单的爱,这是程序员懒惰的一种体现,可以写出更简洁高校的代码,赞一个。

比较

既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。

第一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。

第二是编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。

总结

lambda表达式还有很多用法,比如迭代器,详细用法请参考这里: Java8 lambda表达式10个示例

好了,希望你们喜欢!!!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lambda表达式的使用 的相关文章

随机推荐

  • 在 VMware 虚拟机中安装 open-vm-tools

    什么是 open vm tools xff1f open vm tools 是 VMware Tools 的开源实施 xff0c 由一套虚拟化实用程序组成 xff0c 这些程序可增强虚拟机在 VMware 环境中的功能 xff0c 使管理更
  • FreeRTOS任务管理与控制

    Task c文件 xff1a 全局变量 xff1a static xList pxReadyTasksLists configMAX PRIORITIES static xListxDelayedTaskList1 PRIVILEGED D
  • stm32 烧写下载失败 Error: Flash Download failed - "Cortex-M3"

    问题 xff1a Error Flash Download failed 34 Cortex M3 34 Load 34 10 10 axf 34 Set JLink Project File to 34 G vs keil test 10
  • 查看GIT项目在哪个路径下,查看GIT项目是从GIT的哪个分支上拉下来的命令

    转自 xff1a https www cnblogs com jishan coder p 8554782 html 1 根据路径找到本地存储地址 右键 如图 右键后可以看到有git Bash Here 前提是安装了git 点击 即可进入到
  • C++调用Python(混合编程)函数整理总结

    文章目录 C 43 43 调用python概述相关官方文档相关函数1 初始化python解释器环境2 调用python脚本的静态简单方式3 动态加载python模块并执行函数3 1不带参数和返回值的举例说明3 2带参数和返回值的举例说明 4
  • Markdown写作工具-Typora

    工具 Typora详解 零 文章目录 一 MarkDown 1 MarkDown是什么 Markdown 是一种轻量级标记语言 xff0c 它允许人们使用易读易写的纯文本格式编写文档 Markdown 语言在 2004 由约翰 格鲁伯 xf
  • git pull 强制覆盖本地的代码

    git pull 强制覆盖本地的代码方式 xff0c 下面是正确的方法 xff1a git fetch all 然后 xff0c 你有两个选择 xff1a git reset hard origin master 或者如果你在其他分支上 x
  • SMPL可视化大杀器,你并不需要下载SMPL就能可视化你的3D Pose

    SMPL 是一种3D人体建模方法 xff0c 现在几乎所有的元宇宙人体建模都是基于此类方法 xff0c 包括但不限于元宇宙 xff0c 自动驾驶等领域 它能估计出比较准确的人体3D姿态 xff0c 得益于海量数据训练的人体3D先验 不仅仅是
  • 程序员要多跳巢才能涨工资

    不要一辈子呆死在一家公司 都是打工高薪才是王道 fs xff1a 这 篇文章的本意 xff0c 是告诉大家如何识别公司 而不是鼓励大家无脑跳槽 只有当你在一个公司略有所成的时候 xff0c 你才能有所积累 跳槽更多时候 xff0c 应该看到
  • C++ 用libcurl库进行http通讯网络编程

    转自 http www cnblogs com moodlxs archive 2012 10 15 2724318 html 目录索引 xff1a 一 LibCurl基本编程框架 二 一些基本的函数 三 curl easy setopt函
  • 群晖NAS教程(一) 、利用Docker安装MySQL8并远程访问

    为了更好的浏览体验 欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程 一 利用Docker安装MySQL8并远程访问 做为一个NAS发烧友玩家 在追求极致硬件配置的同时 也想在各个方面压榨一下自己的黑群晖 要不就对不起自己投入那么多的毛爷爷
  • 群晖NAS教程(二)、利用Docker安装Ubuntu并远程访问

    为了更好的浏览体验 欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程 二 利用Docker安装Ubuntu并远程访问 作者 小景哥哥 一 下载镜像ubuntu upstart 一定要选这个镜像 双击运行 二 设置Ubuntu启动参数和端口号
  • 群晖NAS教程(五)、利用Docker安装Ubuntu-21.04并在Ubuntu上安装Redis进行远程访问

    为了更好的浏览体验 欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程 五 利用Docker安装Ubuntu 21 04并在Ubuntu上安装Redis进行远程访问 由于上节我们安装的Ubuntu完全可以当做一个服务器来使用 这个可以完全替代
  • 群晖NAS教程(七)、利用Docker安装elasticsearch并进行远程访问

    为了更好的浏览体验 欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程 七 利用Docker安装elasticsearch并进行远程访问 一 下载elasticsearch官方镜像 然后直接下载elasticsearch镜像即可 二 配置el
  • Airsim通过ros发布激光雷达数据+Lego-loam仿真测试(2)

    上篇博客只是简单跑通了流程 xff0c 存在的问题将在这篇进行修正 一 Lego loam里话题订阅 雷达点云话题为 xff1a velodyne points xff0c frame id为velodyne IMU话题为 xff1a Im
  • [控制算法]

    常用控制算法 0 博览众长 0 1 视频 1 DR CAN b站 0 2 文章 1 控制算法整理 0 3 传统 VS 现代控制算法 1 传统 传统控制算法 xff1a PID xff0c 模糊 xff0c 神经网络控制算法 2 现代 现代控
  • 七、输入/输出流--streambuffer类介绍--

    缓冲区类 类模板定义为basic streambuf xff0c 由 lt iostream gt 给出 xff1a 1 stream缓冲区 通常stream不负责实际读写操作 xff0c 而是stream buffer实现streambu
  • 七、输入/输出流--streambuffer类介绍--自定义缓冲区

    基本上没看懂 xff0c 那个大神如果可以的话 xff0c 推荐一点相关资料 xff0c 真的不太明白这个缓冲区的内部原理 3 自定义缓冲区 缓冲区有basic streambuf定义 xff0c 针对字型为char和wchar标准库提供了
  • 串口通信学习(GPS模块)2021.5.10

    GPS串口通信学习实践 2021 5 10 1 串口通信简介1 1 波特率1 2 数据位1 3 停止位1 4 奇偶校验位 2 GPS模块串口通信配置2 1 驱动安装2 2 插入GPS模块2 3 GPS模块串口通信数据简介 3 Java实现G
  • Lambda表达式的使用

    对于jdk1 8其实并不是那么熟悉 xff0c 但是要学习这一点 xff0c 对以后工作有好处 xff0c 接下来开始学习jdk1 8在Android studio的配置以及lambda表达式的使用吧 Lambda表达式 jdk1 8中新增