当前位置: 首页 > news >正文

java基础之Java8新特性-Lambda

目录

什么是Lambda表达式

Lambda表达式规范

基本语法

参数列表

函数体

注意事项

如何定义函数接口

1.保证接口中只能有一个抽象方法

2.使用@FunctionalInterface注解标记该接口为函数接口

使用Lambda调用无参函数

使用Lambda调用有参函数

使用Lambda的精简写法

使用Lambda实现集合遍历

使用Lambda实现集合排序

使用Lambda实现线程调用


什么是Lambda表达式

Lambda 表达式是 Java 8 引入的一种新的语法特性,它可以使得代码更加简洁、易读,并且支持函数式编程。Lambda 表达式实际上就是一个匿名方法,它可以作为参数传递给方法或者存储在变量中。

Lambda表达式规范

基本语法

Lambda 表达式由参数列表、箭头符号和函数体组成。

(参数列表) -> 函数体

参数列表

Lambda 表达式可以有零个或多个参数。如果没有参数,可以使用空括号表示 ();如果只有一个参数,可以省略括号;如果有多个参数,需要使用逗号将它们分隔开。

() -> System.out.println("Hello")

x -> x * x

(x, y) -> x + y

函数体

Lambda 表达式的函数体可以是一个表达式,也可以是一个语句块。如果函数体只有一条表达式,可以直接写在箭头后面;如果函数体包含多条语句,需要使用大括号 {} 将它们括起来,并使用分号 ; 分隔。

x -> x * x

(x, y) -> { int sum = x + y; System.out.println(sum); }

类型推断:Lambda 表达式中的参数类型可以根据上下文进行推断,不需要显式地指定类型。编译器会根据参数的使用情况来确定参数的类型。

(x, y) -> x + y

注意事项

Lambda 表达式只能用于函数式接口,即只包含一个抽象方法的接口。在使用 Lambda 表达式时,需要根据函数式接口的抽象方法定义来确定参数列表和返回值类型

如何定义函数接口

定义一个函数接口需要满足以下两点:

1.保证接口中只能有一个抽象方法

2.使用@FunctionalInterface注解标记该接口为函数接口

@FunctionalInterface
public interface MyInterfaceByJava8 {void add();//只能存在一个抽象方法}

使用Lambda调用无参函数

首先定义一个函数接口

@FunctionalInterface
public interface FuncInterface {void add();
}

接着实现并调用这个无参函数,这里展示传统的匿名内部类调用法,跟Lambda调用法。

public static void main(String [] args){//使用匿名内部类调用new FuncInterface(){@Overridepublic void add() {System.out.println("匿名内部类实现调用");}}.add();//使用Lambda调用((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();}

可以看到使用Lambda代码更加简洁优雅

使用Lambda调用有参函数

定义函数接口

@FunctionalInterface
public interface FuncInterface2 {int del(int id);
}

实现并调用

public static void main(String [] args){int id=101;//使用匿名内部类调用int result1=new FuncInterface2(){@Overridepublic int del(int id) {System.out.println("匿名内部类实现调用:"+id);return 1;}}.del(id);//使用Lambda调用int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);System.out.println(result1);System.out.println(result2);}

使用Lambda的精简写法

当函数参数仅有一个时可以省略括号(没有参数时必须用空括号,不能省

//普通写法
int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);//精简写法--省略参数园括号
int result2=((FuncInterface2)p->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);

当函数体只有一条语句可以省略{}

//普通写法
((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();//精简写法--省略函数体括号
((FuncInterface)()->System.out.println("Lambda实现调用")).add();

当函数体仅有一条语句且是返回语句时,可以省略return

//普通写法
int result2=((FuncInterface2)p->return 1).del(id);//精简写法--省略return
int result2=((FuncInterface2)p->1).del(id);

使用Lambda实现集合遍历

public static void main(String [] args){List<String> names=Arrays.asList("小明","小黑","小红");//传统遍历--增强forfor(String name:names){System.out.println(name);}//传统遍历--匿名内部类names.forEach(new Consumer<String>(){@Overridepublic void accept(String name) {System.out.println(name);}});//Lambda表达式遍历names.forEach(name->System.out.println(name));}

使用Lambda实现集合排序

将学生集合的学生按照年龄排序

public static void main(String [] args){List<Student> students1=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));List<Student> students2=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//传统排序--匿名内部类students1.sort(new Comparator<Student>(){@Overridepublic int compare(Student stu1, Student stu2) {return stu1.getAge()- stu2.getAge();}});//Lambdastudents2.sort((stu1,stu2)->stu1.getAge()-stu2.getAge());//省略returnSystem.out.println(students1);System.out.println(students2);}

使用Lambda实现线程调用

public static void main(String [] args){//传统调用new Thread(new Runnable(){@Overridepublic void run() {System.out.println("子线程运行了");}}).start();//Lambdanew Thread(()->System.out.println("子线程运行了")).start();}

相关文章:

java基础之Java8新特性-Lambda

目录 什么是Lambda表达式 Lambda表达式规范 基本语法 参数列表 函数体 注意事项 如何定义函数接口 1.保证接口中只能有一个抽象方法 2.使用FunctionalInterface注解标记该接口为函数接口 使用Lambda调用无参函数 使用Lambda调用有参函数 使用Lambda的精简写法 使用…...

入门使用mybatis-plus

第一步&#xff1a;pom文件带入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version> </dependency> 第二步&#xff1a;创建实体对象 TableName(&…...

ubuntu安装和配置ssh教程

一、前言 ssh服务类似于windows的远程桌面服务,可以实现对linux系统的远程管理,ssh默认端口为22端口。后面博主进行操作以ubuntu2020操作系统为例进行操作。 二、安装ssh服务 Ubuntu 2020 默认不安装 SSH 服务。它只安装了 SSH 客户端,可以用于连接到其他计算机上的 SSH 服…...

每天刷两道题——第六天

1.1字母异位词分组 给你一个字符串数组&#xff0c;将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词指的是由重新排列源单词的所有字母得到的一个新单词。 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,…...

时间序列平稳性相关检验方法

理解平稳性 一般来说&#xff0c;平稳时间序列是指随着时间的推移具有相当稳定的统计特性的时间序列&#xff0c;特别是在均值和方差方面。平稳性可能是一个比较模糊的概念&#xff0c;将序列排除为不平稳可能比说序列是平稳的更容易。通常不平稳序列有几个特征&#xff1a; …...

<leetcode修炼>双指针训练-移动零

题目: 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 方法1: 快慢指针 快指针负责遍历数组中所有元素&#xff0c;慢指针负责记录不为0的…...

Python初探:从零开始的编程奇妙之旅

一、Python是什么 Python是一门多用途的高级编程语言&#xff0c;以其简洁、易读的语法而脱颖而出。在深度学习领域&#xff0c;Python扮演着至关重要的角色。其丰富的科学计算库&#xff08;如NumPy、Pandas、Matplotlib&#xff09;和强大的深度学习框架&#xff08;如Tenso…...

算法与数据结构之链表<一>(Java)

目录 1、链表的定义 2、链表的特点 3、为何要使用链表 4、数组与链表的区别 5、链表的增删查 5.1、在头部插入链表 5.2、在中间插入链表 5.3、删除头节点 5.4、删除中间节点 5.5、查询某个值 6、链表的应用 6.1 如何设计一个LRU缓存算法&#xff1f; 6.2 约瑟夫问题 1、链表的定…...

目标检测COCO数据集与评价体系mAP

1.mAP 2.IoU IoU也就是交并比&#xff0c;也称为 Jaccard 指数&#xff0c;用于计算真实边界框与预测边界框之间的重叠程度。它是真值框与预测边界框的交集和并集之间的比值。Ground Truth边界框是测试集中手工标记的边界框&#xff0c;用于指定对象图像的位置以及预测的边界框…...

2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在Web3技术迅速发展的时代&#xff0c;寻找一个综合且深入的Web3开发工具和学习项目资源平台变得至关重要。今天&#xff0c;我将向大家介绍一个非常有价值的网站&#xff0c;它就是https://web3x.world 。 Web3X是一个全面而深入的Web3开发者社区&#xff0c;为开发者们提供了…...

Golang - defer关键字 深入剖析

defer关键字 defer和go一样都是Go语言提供的关键字。defer用于资源的释放&#xff0c;会在函数返回之前进行调用。一般采用如下模式&#xff1a; f,err : os.Open(filename) if err ! nil {panic(err) } defer f.Close()如果有多个defer表达式&#xff0c;调用顺序类似于栈&a…...

如何在Spring Boot中使用@Scheduled写定时任务判断数据量是否过大,过大则进行分表操作,多张表使用临时视图查询

当数据量过大&#xff0c;在定时任务中执行分表操作 1、复制表结构及数据 在xml中编写复制表结构及数据&#xff08;newTableName为新表名、originalTableName为原始表名&#xff09; 只复制表结构&#xff1a; CREATE TABLE ${newTableName} AS SELECT * FROM ${originalTa…...

使用jieba库进行中文分词和去除停用词

jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数&#xff0c;它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数&#xff1a;需要分词的字符串&#xff0c;是否使用全模式&#xff08;默认为False&#xff09;以及是否使用HMM模型&…...

C语言之分支与循环【附6个练习】

文章目录 前言一、什么是语句&#xff1f;1.1 表达式语句1.2 函数调用语句1.3 控制语句1.4 复合语句1.5 空语句 二、分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 练习&#xff08;1. 判断一个数是否为奇数 2. 输出1-100之间的奇数&#xff09; 2.2…...

使用通用MCU实现无人机飞行任务的快速二次开发

使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知&#xff0c;在以往TI电赛真题的学习…...

什么是Selinux

官网地址&#xff1a;What is SELinux? 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 概述 安全增强型 Linux (SELinux) 是Linux 系统的安全架构&#xff0c;允许管理员更好地控制谁可以访问系统。它最初是由美…...

计算机网络知识点

1. URI 和 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff09;&#xff0c;是对资源的引用和访问该资源的方法。俗称网址&#xff0c;就是浏览器地址栏里面的内容。 URL 语法为&#xff1a;protocol://userInfohost:port/p…...

Qt 连接 Mysql

Linux下安装mysql及qt连接_liunx下安装mysql及qt链接-CSDN博客...

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…...

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY&#xff0c;同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里&#xff0c;这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...

告别‘纸片感’!用C++手撸一个带虚焦模糊的光线追踪相机(附完整代码)

告别‘纸片感’&#xff01;用C手撸一个带虚焦模糊的光线追踪相机&#xff08;附完整代码&#xff09; 你是否曾经觉得自己的光线追踪渲染图缺少一丝真实感&#xff1f;那些完美聚焦的物体虽然清晰&#xff0c;却总给人一种"纸片"般的扁平感。今天&#xff0c;我们将…...

NSSM 实战手册:一键将你的脚本与程序转化为 Windows 后台服务

1. NSSM&#xff1a;Windows后台服务的万能钥匙 第一次在服务器上部署Node.js应用时&#xff0c;我盯着那个黑漆漆的命令行窗口发愁——只要关掉窗口&#xff0c;服务就断了。直到发现了NSSM这个神器&#xff0c;才明白原来把普通程序变成系统服务可以这么简单。NSSM全称Non-Su…...

基于python+flask的灾区救援物资管理系统

目录系统架构设计数据库模型设计核心功能实现数据可视化模块部署方案扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统架构设计 采用Flask作为后端框架&#xff0c;搭配SQLAlchemy进行数据库操作&#xff0c;前…...

基于Matlab的FFT滤波:谐波分析、频段清除与数据提取

基于matlab的FFT滤波&#xff0c;可以实现对simulink模型中示波器的波形数据或者外部mat数据、csv数据进行谐波分析(FFT)和自定义频段清除&#xff0c;对已有数据特定频段的数据进行提取也可以。 优点是滤波前后波形无相位滞后&#xff0c;幅值衰减可补偿&#xff0c;不足之处在…...

Kafka订阅模式深度对比:assign vs subscribe在分布式系统中的正确使用姿势

Kafka订阅模式深度解析&#xff1a;assign与subscribe的架构师级实践指南 在分布式消息系统的设计中&#xff0c;Kafka作为核心基础设施的选择已经毋庸置疑。但真正决定系统健壮性的&#xff0c;往往是对消费端订阅模式的精准把控。assign与subscribe两种看似简单的API背后&…...

Ubuntu双系统安装失败?天选5Pro的Intel RST问题全解析

天选5Pro双系统安装困境&#xff1a;Intel RST技术原理与实战解决方案 当技术爱好者们满怀期待地在新购置的天选5Pro笔记本上尝试安装Ubuntu双系统时&#xff0c;往往会遭遇一个令人困惑的障碍——安装程序无法识别磁盘设备。这个看似简单的硬件兼容性问题背后&#xff0c;实际…...

112_深度学习的导航仪:PyTorch 优化器(Optimizer)全解析

在经历了前向传播计算 Loss、反向传播计算梯度&#xff08;Gradient&#xff09;后&#xff0c;我们来到了最关键的一步&#xff1a;更新参数。优化器就像是一位经验丰富的导航员&#xff0c;它根据梯度指示的方向&#xff0c;决定如何调整模型的权重&#xff0c;使 Loss 降到最…...

YOLO图像标注神器labelImg:从安装到实战标注全流程指南

1. 为什么选择labelImg进行YOLO图像标注 如果你正在做目标检测项目&#xff0c;特别是使用YOLO系列算法&#xff0c;那么图像标注是绕不开的关键步骤。在众多标注工具中&#xff0c;labelImg以其简单易用、完全免费、支持YOLO格式等特点脱颖而出。我最早接触这个工具是在2016年…...

龙芯99pai开发板网络配置避坑实录:从串口连接到静态IP,新手也能一次点亮

龙芯99pai开发板网络配置避坑实录&#xff1a;从串口连接到静态IP&#xff0c;新手也能一次点亮 第一次接触龙芯99pai开发板时&#xff0c;网络配置往往是新手开发者遇到的第一个拦路虎。从硬件连接到软件配置&#xff0c;从串口调试到静态IP设置&#xff0c;每个环节都可能隐藏…...

好用还专业!10个降AIGC软件全学科适配测评,帮你高效降AI率

在学术写作日益依赖AI工具的今天&#xff0c;论文的AIGC率问题逐渐成为学生和研究者关注的焦点。如何在保持原文语义通顺的前提下有效降低AI痕迹&#xff0c;成为了论文修改过程中不可忽视的一环。AI降重工具的出现&#xff0c;正是为了解决这一难题。它们通过智能算法识别并优…...