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,一经查实,立即删除!

相关文章

普通数据库索引与搜索引擎的索引有何区别

普通数据库索引,如关系型数据库(RDBMS)中的B树(B-tree)或哈希索引,与搜索引擎使用的倒排索引(Inverted Index)之间存在几个关键区别: 数据结构: 普通数据库索…

【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…

ubuntu如何升级Cmake

在编译最新版的OBS时提示我cmake版本太老了: CMake Error at CMakeLists.txt:1 (cmake_minimum_required):CMake 3.22 or higher is required. You are running version 3.20.2先看下没升级前的版本: 升级一下cmake 1、下载需要的版本 https://cmake…

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

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

微信小程序(3.3.5) 对实时帧数据调速

前言 小程序返回的实时帧数据帧率很高,需要减速处理。 处理思路:打开监听端口,监听到1帧数据,调用回调函数处理,然后关闭监听端口。 把上述过程封装到一个函数里,再用setInterval()函数按一定时间调用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…

opencv加载出来的灰度图如何传递给pyqt的QImage?

在将OpenCV图像数据传递到PyQt的QImage之前&#xff0c;需要理解两者之间的转换关系。OpenCV通常使用cv2.imread()等函数加载图像&#xff0c;返回的是一个NumPy数组。而QImage是Qt框架中用于图像显示的类。 要将OpenCV的灰度图像转换为QImage&#xff0c;你需要执行以下步骤&a…

【开发总结】Rust的命令行库clap

偶然了解到Rust中有命令行处理的相关库clap&#xff0c;可以很方便的解决程序员需要编写命令行程序时的命令行输入参数问题。 在CSDN中找到了一篇文章进行学习&#xff0c;将一些感想记录如下&#xff1a; 首先该文章的运行环境是cargo&#xff0c;首先需要通过 cargo new &qu…

Java_21 完成一半题目

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

selenium 4 自动化~~~操作浏览器

前言 无意中将selenium版本更新了&#xff0c;原先的脚本跑不起来&#xff0c;报错一直是浏览器驱动版本不对&#xff0c;尝试了几种启动浏览器的方法&#xff0c;一直无法解决&#xff0c;直到看到了一篇selenium版本更新的文章才意识到可能是版本升级后的差异&#xff0c;于…

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

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

spark log4j日志文件动态参数读取

需要在log4j xml文件中设置动态参数&#xff0c;并支持spark任务在集群模式下&#xff0c;动态参数读取正常&#xff1b; 1.log4j配置文件 log4j2.xml <?xml version"1.0" encoding"UTF-8"?> <Configuration status"info" name&quo…

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;在…