02-JDK新特性-Lambda表达式

JDK新特性

Lambda表达式

什么是Lambda表达式

Lambda表达式是一个匿名代码块,用于简单的传递一段代码片段。

Lambda表达式标准格式

格式:(形式参数) -> {代码块}

  • 形式参数

    如果有多个参数,参数只见用逗号隔开;如果没有,留空即可
  • ->

    由英文中画线和大于符号组成,固定写法。代表指向动作。
  • 代码块

    是我们具体要做的事情,也就是我们以前写的方法体内容
// 组成Lambda表达式的三要素:形式参数,箭头,代码块
// 示例 
new Thread(() -> System.out.println("这是一个示例")).start();

Lambda表达式的使用前提

  • 有一个接口
  • 接口中有且仅有一个抽象方法

理解Lambda表达式

定义一只接口(Eatable),里面定义一个抽象方法:void eat();表示吃这一个动作。
然后以实现类,匿名内部类,Lambda表达式分别实现一下小明吃饭了这一动作。

通用接口 Eatable.java
package demo01;/*** 定义吃接口** @author Anna.* @date 2024/3/31 22:35*/
public interface Eatable {/*** 吃** @param* @return void* @author Anna.* @date 2024/3/31 22:35*/void eat();
}
实现类方式实现

创建一个实现类(EatImpl)实现(Eatable)接口

package demo01;/*** 吃实现类** @author Anna.* @date 2024/3/31 22:37*/
public class EatImpl implements Eatable{@Overridepublic void eat() {System.out.println("通过实现类-小明吃东西了");}
}

测试代码

package demo01;import java.util.Arrays;/*** Demo01:* 定义一只接口(Eatable),里面定义一个抽象方法:void eat();表示吃这一个动作。* 然后以实现类,匿名内部类,Lambda表达式分别实现一下小明吃饭了这一动作。** @author Anna.* @date 2024/3/31 22:36*/
public class LambdaDemo01 {public static void main(String[] args) {// 通过实现类实现Eatable eat = new EatImpl();eat.eat();}
}

执行结果

在这里插入图片描述

匿名内部类方式实现

测试代码

package demo01;import java.util.Arrays;/*** Demo01:* 定义一只接口(Eatable),里面定义一个抽象方法:void eat();表示吃这一个动作。* 然后以实现类,匿名内部类,Lambda表达式分别实现一下小明吃饭了这一动作。** @author Anna.* @date 2024/3/31 22:36*/
public class LambdaDemo01 {public static void main(String[] args) {// 匿名内部类方式实现eat(new Eatable() {@Overridepublic void eat() {System.out.println("通过匿名内部类方式实现-小明吃东西了");}});}/*** 定义一个调用Eatable接口eat()的方法** @param eatable* @return void* @author Anna.* @date 2024/3/31 22:50*/private static void eat(Eatable eatable){eatable.eat();}
}

执行结果

在这里插入图片描述

Lambda表达式实现

测试代码

package demo01;import java.util.Arrays;/*** Demo01:* 定义一只接口(Eatable),里面定义一个抽象方法:void eat();表示吃这一个动作。* 然后以实现类,匿名内部类,Lambda表达式分别实现一下小明吃饭了这一动作。** @author Anna.* @date 2024/3/31 22:36*/
public class LambdaDemo01 {public static void main(String[] args) {// Lambda表达式实现eat(() -> {System.out.println("通过Lambda表达式实现-小明吃东西了");});}/*** 定义一个调用Eatable接口eat()的方法** @param eatable* @return void* @author Anna.* @date 2024/3/31 22:50*/private static void eat(Eatable eatable) {eatable.eat();}
}

执行结果

在这里插入图片描述

对比实现类,匿名内部类,Lambda表达式编译文件

在这里插入图片描述

通过实现类方式实现,会生成EatImpl.class文件

通过匿名内部类方式实现,会生成LambdaDemo01$1.class匿名内部类文件

通过Lambda方式实现,不会额外生成文件,实现字节码会动态生成

Lambda表达式的省略模式

省略规则:

  1. 参数类型可以省略,但是多个参数的情况下,不能只省略一个
  2. 如果参数有且仅有一个,那么小括号可以省略
  3. 如果代码块的语句只有一条,大括号和分号可以省略,甚至是return

测试代码

package demo02;import demo01.Eatable;/*** Demo02:* Lambda表达式省略模式** @author Anna.* @date 2024/3/31 22:36*/
public class LambdaDemo02 {public static void main(String[] args) {// 正常调用System.out.println("=========正常调用=========");eat(() -> {System.out.println("小明吃东西了");});sum((int x, int y) -> {return x + y;});sleep((String name) -> {System.out.println(name + "睡觉了");});// 省略模式System.out.println("=========省略模式=========");System.out.println("=========参数类型可以省略=========");sleep((name) -> {System.out.println(name + "睡觉了");});// 参数类型可以省略,但是多个参数的情况下,不能只省略一个System.out.println("=========参数类型可以省略,但是多个参数的情况下,不能只省略一个=========");sum((x, y) -> {return x + y;});// 如果参数有且仅有一个,那么小括号可以省略System.out.println("=========如果参数有且仅有一个,那么小括号可以省略=========");sleep(name -> {System.out.println(name + "睡觉了");});// 如果代码块的语句只有一条,大括号和分号可以省略System.out.println("=========如果代码块的语句只有一条,大括号和分号可以省略=========");sleep(name -> System.out.println(name + "睡觉了"));// 如果代码块的语句只有一条,且有返回值 return 也可以省略System.out.println("=========如果代码块的语句只有一条,且有返回值 return 也可以省略=========");sum((x, y) -> x + y);}/*** 定义一个调用Eatable接口eat()的方法** @param eatable* @return void* @author Anna.* @date 2024/3/31 23:11*/private static void eat(Eatable eatable) {eatable.eat();}/*** 定义一个调用Sumable接口sum()的方法** @param sumable* @return void* @author Anna.* @date 2024/3/31 23:11*/private static void sum(Sumable sumable) {System.out.println(sumable.sum(20, 30));}/*** 定义一个调用Sleepable接口sleep()的方法** @param sleepable* @return void* @author Anna.* @date 2024/3/31 23:11*/private static void sleep(Sleepable sleepable) {sleepable.sleep("小明");}
}

执行结果

在这里插入图片描述

Lamda表达式的方法引用

学习lamda千万不要注意方法,一定要关心方法的入参的个数和类型以及出参的类型,不要关注方法的名称
方法引用被分为了好几类:

  1. 静态方法引用 Class::methodName
  2. 实例方法引用 objInstance::methodName
  3. 引用类中的非静态方法:Class::methodName
  4. 引用类的构造方法:Class::new 其中Class就是类名,后面跟“::new”,这个是固定写法哈,即使为了new一个对象出来

Sumable.java

package demo3;public interface Sumable {int sum(int x, int y);
}

SumImpl.java

package demo3;public class SumImpl implements Sumable {@Overridepublic int sum(int x, int y) {return x + y;}
}

SumUtils.java

package demo3;public class SumUtils {public int sum(int x, int y) {return x + y;}
}

IEntityDo.java

package demo3;public interface IEntityDo {SumEntity init(int x, int y);
}

SumEntity.java

package demo3;public class SumEntity {private int x;private int y;public SumEntity(int x, int y) {this.x = x;this.y = y;}@Overridepublic String toString() {return "SumEntity{" +"x=" + x +", y=" + y +'}';}
}

LambdaDemo03.java

package demo3;/*** Demo03:* Lambda表达式方法引用** @author Anna.* @date 2024/3/31 22:36*/
public class LambdaDemo03 {public static void main(String[] args) {System.out.println("Lambda方法");sum(((x, y) -> x + y));System.out.println("静态方法引用");sum(Integer::sum);System.out.println("实例方法引用");Sumable sumable = new SumImpl();sum(sumable::sum);System.out.println("如果该接口有且仅有一个抽象方法,还可以进一步省略::内容");sum(sumable);System.out.println("引用类中的非静态方法");SumUtils sumUtils = new SumUtils();sum(sumUtils::sum);System.out.println("引用类的构造方法");init(SumEntity::new);}/*** 定义一个调用Sumable接口sum()的方法** @param sumable* @return void* @author Anna.* @date 2024/3/31 23:11*/private static void sum(Sumable sumable) {System.out.println(sumable.sum(20, 30));}/*** 定义一个调用EntityDo接口init()的方法** @param entityDo* @return void* @author Anna.* @date 2024/3/31 23:11*/private static void init(IEntityDo entityDo) {System.out.println(entityDo.init(20, 30));}
}

执行结果

在这里插入图片描述

Lambda表达式优缺点

Java 8中引入了lambda表达式,使得代码编写更加简洁、优雅。lambda表达式是一个匿名函数,可以作为参数传递给方法或者存储在变量中。在Java中使用lambda表达式可以有以下优点和缺点:

优点

  1. 代码简洁:使用lambda表达式可以减少冗余的代码量,使得代码更加简洁明了。特别是在编写只有一个抽象方法的接口时,可以将其替换为lambda表达式。
  2. 促进函数式编程:lambda表达式使得函数式编程成为可能。函数式编程强调函数的纯粹性和不可变性,有助于减少副作用和提高代码的可维护性。通过lambda表达式,我们可以将函数作为一等公民,并在不改变状态的情况下进行操作。
  3. 更好的代码复用:使用lambda表达式可以更方便地实现代码的复用。可以将一段逻辑封装在一个lambda表达式中,然后在多个地方使用。
  4. 并行处理能力:在Java 8之前,要实现多线程或并行处理需要编写大量的代码。使用lambda表达式可以方便地编写并行处理的代码,充分利用多核处理器的性能。
  5. 提升代码可读性:lambda表达式将逻辑封装在一个更加紧凑的形式中,使得代码更易读。通过命名良好的lambda表达式,可以使代码的意图更加清晰。

缺点

  1. 学习成本:lambda表达式是一个新的概念,在Java中引入了新的语法。对于初学者来说,学习和理解lambda表达式需要一些时间和努力。
  2. 可读性差:虽然lambda表达式可以提升代码的可读性,但是过于复杂的lambda表达式可能反而降低代码的可读性。尤其是当lambda表达式包含多个参数、多行代码或复杂的逻辑时,可读性会受到影响。
  3. 调试困难:由于lambda表达式是匿名函数,调试时可能会更加困难。在调试过程中,无法直接跟踪lambda表达式的执行路径,可能会增加调试的难度。
  4. 性能问题:lambda表达式的性能可能比传统的方法调用略差。虽然这个差距很小,但是在某些高性能场景下可能会有所影响。

总结:

lambda表达式是Java 8引入的一项强大的功能,对于简化代码、促进函数式编程、提升代码可读性和代码复用等方面都有很大的帮助。

然而,它也存在着一些学习成本高、可读性差、调试困难和性能问题等缺点。

在使用lambda表达式时,需要根据具体情况权衡利弊,选择合适的使用方式。

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

【Linux 10】环境变量

文章目录 🌈 Ⅰ 命令行参数⭐ 1. main 函数的参数⭐ 2. main 函数参数的意义⭐ 3. 查看 argv 数组的内容⭐ 4. 命令行参数结论⭐ 5. 为什么要有命令行参数⭐ 6. 命令行参数传递由谁执行 🌈 Ⅱ 环境变量基本概念⭐ 1. 常见环境变量 🌈 Ⅲ 查看…

macOS Catalina for mac (macos 10.15系统)v10.15.7正式版

macOS Catalina是苹果公司专为麦金塔电脑推出的桌面操作系统,是macOS的第16个主要版本。它继承了苹果一贯的优雅与高效,不仅引入了分割视图和侧边栏,还带来了全新的音乐和播客应用,极大地提升了用户体验。在隐私保护和安全性方面&…

【Laravel】07 快速套用一个网站模板

【Laravel】07 快速套用一个网站模板 1. 新增post表2.补充 :生成Model、Controller、迁移文件3. 使用php artisan tinker4. 网站模板下载 课程地址 1. 新增post表 在Model中创建Post (base) ➜ example-app php artisan make:model Post Model created successfu…

练习3-2 计算符号函数的值

对于任一整数n,符号函数sign(n)的定义如下: 请编写程序计算该函数对任一输入整数的值。 输入格式: 输入在一行中给出整数n。 输出格式: 在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。 输入样例1: 10 输出样例1: sign(10) 1 输入样例…

pytest--python的一种测试框架--pytest常用断言类型

一、pytest常用断言类型 等于: 不等于&#xff1a;&#xff01; 大于&#xff1a;> 小于&#xff1a;< 属于&#xff1a;in 不属于&#xff1a;not in 大于等于&#xff1a;> 小于等于&#xff1a;< 是&#xff1a;is 不是&#xff1a;is not def test_two():ass…

Java_21 完成一半题目

完成一半题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例…

【Spring Boot 源码学习】ConditionEvaluationReport 日志记录上下文初始化器

《Spring Boot 源码学习系列》 ConditionEvaluationReport 日志记录上下文初始化器 一、引言二、往期内容三、主要内容3.1 源码初识3.2 ConditionEvaluationReport 监听器3.3 onApplicationEvent 方法3.4 条件评估报告的打印展示 四、总结 一、引言 上篇博文《共享 MetadataRe…

cuda cudnn pytorch 的下载方法(anaconda)

文章目录 前言cuda查看当前可支持的最高cuda版本显卡驱动更新下载cuda cudnnpytorch配置虚拟环境创建虚拟环境激活虚拟环境 1.直接下载2.conda 下载(清华源&#xff0c;下载速度慢的看过来)添加清华镜像channel下载下载失败 下载失败解决办法1.浑水摸鱼&#xff0c;风浪越大鱼越…

五、Yocto集成QT5(基于Raspberrypi 4B)

Yocto集成QT5 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第五篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi 4B) 三、Yocto创建自定义的layer和image 四、Yocto创建静态IP和VLAN 本章节实操代码请查看github仓库&…

数据可视化-Python

师从黑马程序员 Json的应用 Json的概念 Json的作用 Json格式数据转化 Python数据和Json数据的相互转化 注&#xff1a;把字典列表变为字符串用dumps,把字符串还原回字典或列表用loads import json#准备列表&#xff0c;列表内每一个元素都是字典&#xff0c;将其转化为Json …

python实战之常用内置模块

一. 数学计算模块(math) 二. 日期时间模块(datetime) 1. datetime类 datetime类的常用方法 2. date类 1. date类的常用方法 3. time类 4. 计算时间跨度类(timedelta) 5. 日期时间与字符串相互转换 1. 日期和时间格式控制符 三. 正则表达式模块(re) 正则表达式指预先定义好一个’…

CCF-CSP26<2022-06>-第1/2/3题

202206-1 归一化处理 题目&#xff1a;202206-1 题目分析&#xff1a; 给出了数学上归一化的数学公式&#xff0c;直接按照要求完成即可。 AC代码&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;double a[n];double s…

吴恩达:现在做GPT-4智能体,或将提前达到GPT-5效果|钛媒体AGI

斯坦福大学客座教授吴恩达&#xff08;Andrew Ng&#xff09;© 林志佳 美国斯坦福大学教授吴恩达&#xff08;Andrew Ng&#xff09; 人工智能智能体&#xff08;AI Agents&#xff09;似乎将引领 AI 行业新的发展趋势。 近日红杉资本&#xff08;Sequoia&#xff09;在…

全面概述Gitee和GitHub生成/添加SSH公钥

前言 现如今将代码开源已经成为软件开发行业的一种趋势&#xff0c;而现在比较有名的代码托管平台有GItHub、Gitee、Gitlab等相关平台。而我们在使用代码托管平台最为常见的就是如何将自己本地的代码推送到远程托管平台中的仓库中&#xff0c;现如今各大托管平台基本上都提供了…

Mac m1 Flink的HelloWorld

首先在官方下载Downloads | Apache Flink 下载好压缩包后解压&#xff0c;得到Flink文件夹 进入&#xff1a;cd flink-1.19.0 ls 查看里面的文件&#xff1a; 执行启动集群 ./bin/start-cluster.sh 输出显示它已经成功地启动了集群&#xff0c;并且正在启动 standalonesessio…

云计算探索-剖析虚拟化技术

引言 虚拟化技术&#xff0c;作为现代信息技术架构的核心构成元素&#xff0c;以其独特的资源抽象与模拟机制&#xff0c;成功地瓦解了物理硬件与操作系统间的刚性连接&#xff0c;开创了一个资源共享、灵活调配的崭新天地。本文将详细解析虚拟化技术的内涵、发展历程、分类及特…

Kafka 学习之:基于 flask 框架通过具体案例详解生产消费者模型,这一篇文章就够了

文章目录 案例信息介绍后端异步处理请求和后端同步处理请求同步方式异步方式 环境文件目录配置.envrequirements.txt 完整代码ext.pyapp.pykafka_create_user.py 运行方式本地安装 kafka运行 app.py使用 postman 测试建立 http 长连接&#xff0c;等待后端处理结果发送 RAW DAT…

金三银四面试题(九):JVM常见面试题(3)

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大&#xff0c;多用于面试中JVM部分的热身运动&#xff0c;开胃菜&#xff0c;但是大家已经要认真准备。 你能保证GC 执行吗&#xff1f; 不能&#xff0c;虽然你可以调用System.gc() 或者Runtime.gc()&#xff0c…

【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【Linux】寿司线程池{单例模式之懒汉模式下的线程池}

文章目录 回顾单例模式0.多线程下的单例模式的意义1.什么是单例模式1.0设计模式1.1C单例模式的介绍及原理1.2拷贝构造和赋值重载的处理1.3if (nullptr ptr)&#xff0c;nullptr放在比较运算符的前面?1.4实现单例模式的方式 2.实现懒汉方式的单例模式2.1单线程的单例模式2.2多…