详解lambda表达式(一):表达式定义与异常处理

news2024/10/2 22:24:14

目录

一、lambda表达式 

二、lambda表达式实现函数接口

2.1 函数式接口

2.2 lambda表达式实现无参抽象方法

2.3 lambda表达式实现有参抽象方法

2.4 lambad表达式使用代码块

 三、lambda表达式调用外部变量

3.1 lambda表达式可以更改类成员变量

3.2 lambda表达式无法更改局部变量

四、异常处理


(本篇笔记整理自明日科技系列书籍)

lambda就是数学中的“λ”的读音,lambda表达式是基于λ演算而得名的,因为lambda抽象(lambda abstraction)表示一个匿名的函数,于是开发语言也将lambda表达式用来表示匿名函数,也就是没有函数名字的函数。C#、Python,甚至是C++都有lambda表达式语法。为了提高开发者的开发效率,并照顾“跨语言”开发者的开发习惯,Java语言也加入了lambda表达式。流处理是Java程序中一种重要的数据处理手段,它用少量的代码便可以执行复杂的数据过滤、映射、查找和收集等功能。

知识框架:

 

一、lambda表达式 

1.1 lambda表达式简介

lambda表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。

基本语法:

()->结果表达式

参数->结果表达式

(参数1,参数2,参数n)->结果表达式

也可以实现复杂方法:

 ()->{代码块}

参数->{代码块}

(参数1,参数2,参数n)->{代码块}

第一行实现无参方法,第二行实现只有一个参数的方法,第三行实现多参数的方法;方法体式操作符右侧代码块。

lambda表达式的语法非常抽象,并且有着非常强大的自动化功能,如自动识别泛型、自动数据类型转换等。简化理解:

()                        ->                  {代码块}

这个方法               按照             这样的代码来实现

总结:操作符左侧是方法参数,操作符右侧的是方法体。

二、lambda表达式实现函数接口

2.1 函数式接口

函数式接口指的是仅包含一个抽象方法的接口,接口中的方法非常简单地说明了接口的用途,如线程接口Runnable等。开发者可以创建自定义的函数式接口,如:

interface MyInterface{
    void method();
}

如果接口中包含一个以上的抽象方法,则不符合函数式接口的规范,这样的接口不能用lambda表达式创建匿名对象。

2.2 lambda表达式实现无参抽象方法

很多函数式接口的抽象方法是无参数的,如线程接口Runnable接口只有一个run()方法,这样的无参抽象方法在lambda表达式中使用"( )"表示。

示例代码:

 本实例直接在lambda表达式中创建SayHiInterface接口对象,并指定了一个字符串作为接口方法的返回值。最后在输出语句中,pi对象就是lambda表达式创建出的对象,当pi调用接口方法时就输出了lambda表达式指定的字符串。

2.3 lambda表达式实现有参抽象方法

lambda表达式中可以用“(a1,a2,a3)”的方法表示有参抽象方法,圆括号里标识符对应抽象方法的参数。如果抽象方法中只有一个参数,lambda表达式则可以省略圆括号。

运行结果如下:

相加结果:41 

在这个实例中,函数式接口的抽象方法有两个参数,lambda表达式的圆括号内也写了两个参数对应的抽象方法。这里有一个点要注意,lambda表达式中的参数不需要与抽象方法的参数名称相同,但顺序必须相同。 

2.4 lambad表达式使用代码块

当函数式接口的抽象方法需要实现复杂逻辑而不是返回一个简单的表达式的话,就需要在lambda表达式中使用代码块。lambda表达式会自动判断返回值类型是否符合抽象方法的定义。

 

 三、lambda表达式调用外部变量

lambda表达式可以调用表达式以外的变量。lambda表达式无法更改局部变量的值,但是却可以更改外部类的成员变量(也可以叫做类属性)的值。

3.1 lambda表达式可以更改类成员变量

类成员变量是在lambda表达式中不是被final修饰的,所以lambda表达式可以改变其值。

创建函数式接口和测试类,在测试类中创建成员属性value和成员方法action()。在action()方法中使用lambda表达式创建接口对象,并在lambda表达式中修改value的值。运行程序,查看value值是否发生变化。

interface Vara { // 测试接口
    void method(); // 测试方法
}
public class Main { // 测试类
    int value = 100;
    
    public void action() {
        Vara v = () -> {
            value = 1;
        };
        System.out.println("运行接口方法前value=" + value);
        v.method(); // 运行接口方法
        System.out.println("运行接口方法后value=" + value);
    }
    public static void main(String[] args) {
        Main demo = new Main();
        demo.action();
    }
}

这里在学习过程中出现了错误,错误使用Vara demo = new Vara(),在代码中,Vara是一个接口,接口是无法直接实例化的。如果想要使用接口,需要通过实现接口的类来创建实例。

结果如下:

运行接口方法前value=100
运行接口方法后value=1

从这个结果中可以看出:

①lambda表达式可以调用并修改类成员变量的值。
②lambda表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda表达式中的代码并没有被执行,所以运行抽象方法之前类成员变量的值不会发生变化。
③只要抽象方法被调用,就会执行lambda表达式中的代码,类成员变量的值就会被修改。

3.2 lambda表达式无法更改局部变量

局部变量在lambda表达式中默认被定义为final(静态)的,也就是说,lambda表达式只能调用局部变量,却不能改变其值。

示例代码:

public class Main {
    public static void main(String[] args) {
        int value = 100;
        
        Runnable runnable = () -> {
            // Lambda表达式中可以读取局部变量value
            System.out.println("读取局部变量value:" + value);
            // 但无法修改局部变量value
            // value = 200; // 编译错误
        };
        
        runnable.run();
    }
}

在这个例子中,我们定义了一个局部变量value,初始值为100。然后我们创建了一个Runnable接口的实例,并使用Lambda表达式实现了run方法。Lambda表达式中可以读取局部变量value的值,但是无法修改该变量的值。如果尝试在Lambda表达式中修改value的值,会导致编译错误。 

四、异常处理

很多接口的抽象方法为了保证程序的安全性,会在定义时就抛出异常。但是lambda表达式中并没有抛出异常的语法,这是因为lambda表达式会默认抛出抽象方法原有的异常,当此方法被调用时则需要进行异常处理。

示例代码:

从这个实例中可以看出,即使lambda表达式没有定义异常,原抽象方法抛出的异常仍然是存在的,当接口对象执行此方法时会被强制要求进行异常处理。

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

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

相关文章

jvs-rules API数据源配置说明(含配置APIdemo视频)

在JVS中,多数据源支持多种形态的数据接入,其中API是企业生产过程中常见的数据形态。使用数据源的集成配置,以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能,使得从不同数据源获取和处理数据变得更加…

datax-web报错收集

在查看datax时发现日志出现了如上错误,因为项目是部署在本地linux虚拟机上的,使用的是nat网络地址转换,不知道为什么虚拟机的端口号发生了变化,导致数据库根本连接不进去,更新linux虚拟机的ip地址就好

【Wamp】安装 | 局域网内设备访问

安装教程: https://wampserver.site/article/1.html 下载 https://www.wampserver.com/en/ 安装路径上不能有中文 安装好之后图标呈绿色 放入网页文件 将网页文件放置于wamp文件夹的www子文件夹 例如:\Wamp\program\www 修改http端口 WAMP服务器…

9.2.2Socket(TCP)

一.过程: 1.建立连接(不是握手),虽然内核中的连接有很多,但是在应用程序中,要一个一个处理. 2. 获取任务:使用ServerSocket.accept()方法,作用是把内核中的连接获取到应用程序中,这个过程类似于生产者消费者模型. 3. 使用缓冲的时候,注意全缓冲和行缓冲. 4.注意关闭文件资源…

docker复现nginx错误配置漏洞

目录 一、nginx环境搭建 1.1搭建步骤 二、docker复现Nginx配置漏洞 2.1安装docker 2.2复现过程 2.1CRLF(carriage return/line feed)注入漏洞 2.2.目录穿越 一、nginx环境搭建 1.1搭建步骤 1.先创建Nginx的目录并进入(命令如下) mkdir /soft &&…

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法一、问题描述二、解决方法1.打开 WORD 2019,点击菜单中的“文件”;…

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——推论

推论 1. 推出结论题 199-2011-1-28——推出结论题——若题干无论点,考虑:(1)大多数情况,考虑:直接将选项代入题干。 一般将缅甸所产的经过风化或经河水搬运至河谷、河床中的翡翠大砾石,称为“…

棒球课堂的发展规划·棒球联盟

棒球课堂的发展规划 1. 棒球课堂的发展环境 探讨棒球课堂如何通过运用创新的教学方法来适应不断变化的市场需求。包括但不限于,科学地运用大数据和人工智能技术来提高教学效率,加强教师队伍的专业培训,以及拓展课外活动,增强学生…

【论文阅读】DEPCOMM:用于攻击调查的系统审核日志的图摘要(SP-2022)

Xu Z, Fang P, Liu C, et al. Depcomm: Graph summarization on system audit logs for attack investigation[C]//2022 IEEE Symposium on Security and Privacy (SP). IEEE, 2022: 540-557. 1 摘要 ​ 提出了 DEPCOMM,这是一种图摘要方法,通过将大图划…

【PythonRS】植被显示增强(多光谱、正射、照片等)

很多时候我们需要某个区域的正射图,虽然正射图一般都运用了匀色的算法,整体色彩比较均衡。但如果研究区内有大量的植被,这个时候植被突出显示就很有必要了。所以今天给大家分享一下使用Python对多光谱、正射影像进行植被显示增强的算法。 一、…

视频怎么变成gif表情包?在线视频转动图怎么做?

当我们在电脑上观看视频时,有时会遇到一些有趣的片段,如果想把这些视频转gif图片,就需要用到视频转gif工具(https://www.gif.cn),今天分享一个使用视频在线转gif功能来完成gif制作的方法,下面是…

代谢组学市场分析,制药及生物制药行业正在推动全球代谢组学产业的发展

代谢组学是对某一生物或细胞所有小分子量代谢产物进行定性和定量分析的一门新兴学科,其揭示的小分子代谢产物变化是机体内基因、蛋白质/酶等功能变化的一系列事件的最终结果,直接反映了生物体系的最终状态,可以反映机体特定病理生理状态下整体…

UML-时序图

目录 时序图 时序图构成: 对象: 消息: 生命线(激活): 活动条: 时序图举例: 时序图 时序图也叫顺序图、序列图. 时序图描述按照时间的先后顺序对象之间的动作过程,是由生命线和消息组成 时序图构成: 对象: 对象是类的实例,对象是通过类来创建的&…

【STM32RT-Thread零基础入门】 3. PIN设备(GPIO)的使用

硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、PIN设备介绍1. 引脚编号获取2. 设置引脚的输入/输出模式3. 设置引脚的电平值4. 读取引脚的电平值5. 绑定引脚中断回调函数6. 脱离引脚中断…

微信开发之获取收藏夹列表的技术实现

简要描述: 获取收藏夹内容 请求URL: http://域名地址/weChatFavorites/favSync 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数…

深度使用苹果M1 Mac电脑一个月后的发现与问题解决

自从苹果推出M1芯片的Mac电脑后,其强大的性能和高效的能耗管理引起了广泛关注。许多人纷纷购买了这款新一代的Mac电脑,并深度使用了一个月。然而,在长时间使用的过程中,一些问题也逐渐浮现出来。本文将分享在深度使用苹果M1 Mac电…

【C++】dynamic_cast基本用法(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

研究论文关于火灾的烟雾探测

普拉萨梅什加德卡尔 探索所有模型以选择最佳模型。 一、介绍: 烟雾探测器检测烟雾并触发警报以提醒他人。通常,它们存在于办公室、家庭、工厂等。通常,烟雾探测器分为两类: Photoelectric Smoke Detector- 设备检测光强度&#x…

8086汇编语言工作环境 百度网盘下载

链接:https://pan.baidu.com/s/1-1K7gX859xejaUK70OTgtw?pwdbfa5 提取码:bfa5 为了方便下载,找了很多资料,也是从其他人那边分享过来的,也方便其他人 文件内容:

如何快速解决集成环信IM遇到的问题?

1、环信FAQ频道发布了 环信FAQ帮助中心提供了各客户端、RESTful API、环信控制台以及商务相关的集成环信常见问题及解决方法,帮您快速解决集成问题 2、当我有问题时,从哪里进FAQ? 干脆收藏这个网址:https://faq.easemob.com/ 环…