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();}

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

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

相关文章

Linux第3步_安装Ubuntu操作系统

创建好虚拟机后&#xff0c;就可以安装Ubuntu操作系统了。 1、双击“VMware Workstation Pro”&#xff0c;得到下面的界面。 2、点击“编辑虚拟机设置”&#xff0c;见下图&#xff1a; 3、等几秒钟&#xff0c;得到下面的界面&#xff1a; 4、点击“CD/DVD”&#xff0c;得到…

vscode无识别已有的maven java项目(visual studio code not recognizing java project)

文章目录 事情经过尝试疑惑问题解决结论 事情经过 未安装任何Java Extension Pack使用 Maven 的 archetype:generate 命令来创建一个新的项目使用vscode打开了该目录然后安装Java Extension Pack等java插件配置了vscode settings.json中的 java.configuration.runtimes和 java…

Ubuntu envs setting

1. change the chmod of folders sudo chown -R $USER:$USER /home/anaconda3 2. torch.cuda.is_available()返回false change conda installation to pip. zai qi ta huan jing pei zhi dou mei wen ti de qing kuang xia , zai shi shi zhe ge fang fa. # CUDA 11.7 con…

Python-1-字符串类型及方法

众所周知&#xff0c;Python面向对象&#xff0c;功能强大 | ू•ૅω•́)ᵎᵎᵎ

mybatis-flex与springBoot整合

mybatis-flex基本使用 1.测试sql2.导入坐标3.框架搭建1.pojo层2.mapper层3.service层4.controller层5.启动类6.配置类7.EmpMapper.xml 4.启动测试 本片文章在springBoot3&#xff0c;jdk21下测试通过 注意官方网站为&#xff1a;https://mybatis-flex.com/ 请点击&#xff1a;直…

使用STM32和ESP8266构建智能家居网络

本文将介绍如何使用STM32微控制器和ESP8266 WiFi模块构建一个智能家居网络。我们将讨论智能家居网络的整体设计思路、硬件连接和软件开发。通过本文的指导和示例代码&#xff0c;读者将能够搭建一个智能家居系统&#xff0c;实现远程控制和数据监测。 一、智能家居网络的整体设…

C++ Optins接口封装设置自动重连

当数据库突然断开的时候&#xff0c;API将接收不到MySQL的连接&#xff0c;在代码里面写关于自动重连可以实现数据库断开之后重连。 1、首先在LXMysql.h创建Option函数 //mysql参数的设定 设置自动重连 在connect之前调用/*int STDCALL mysql_options(MYSQL *mysql, enum mys…

面试题:你如何理解 System.out.println()?

文章目录 前言首先分析System源码&#xff1a;out源码分析println分析 前言 如果你能自己读懂System.out.println()&#xff0c;就真正了解了Java面向对象编程的含义。 面向对象编程即创建了对象&#xff0c;所有的事情让对象帮亲力亲为&#xff08;即对象调用方法&#xff09…

123基于matlab的差分优化算法优化极限学习机,DE-ELM

基于matlab的差分优化算法优化极限学习机&#xff0c;DE-ELM。输出分类识别结果和准确率。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 123差分优化算法极限学习机 (xiaohongshu.com)

关于TCP vegas算法杂谈

看到大佬写的优秀的 tcp vegas 拥塞控制大揭秘-CSDN博客&#xff0c;有感而发&#xff0c;自己研究CC有一段时间了。但是还一直有vegas多牛的说法。从理论上来说&#xff0c;vegas确实是比较好的CC算法&#xff0c;特别是他的公平友好性&#xff0c;我个人也觉得是最好的。 包…

深入了解 Vite:快速、简洁、高效的前端构建工具(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

包含自动轮播、点击切换、显示图片信息和页码方框显示码数的 HTML 和 JavaScript 示例:

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图</title><style>#carousel-conta…

FPGA高端项目:纯verilog的 10G-UDP 高速协议栈,提供7套工程源码和技术支持

目录 1、前言免责声明更新说明 2、相关方案推荐我这里已有的以太网方案本协议栈的千兆网UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设计架构框图网络调试助手GT资源使用GT…

java练习题之String方法运用

应用知识点&#xff1a;​​​​​​String类 1&#xff1a;(String 类)仔细阅读以下代码段&#xff1a; String s "hello"; String t"hello"; char[] c {h,e,l,l,o}; 2&#xff1a;下列选项输出结果为false 的语句是() System.out.println( s.euqals( t…

Leetcode2962. 统计最大元素出现至少 K 次的子数组

Every day a Leetcode 题目来源&#xff1a;2962. 统计最大元素出现至少 K 次的子数组 解法1&#xff1a;滑动窗口 算法如下&#xff1a; 设 mx max⁡(nums)。右端点 right 从左到右遍历 nums。遍历到元素 xnums[right] 时&#xff0c;如果 xmx&#xff0c;就把计数器 co…

Docker安装【学习Docker(十)】Docker SQLServer的安装与卸载、基本命令

文章目录 1. 安装SQL Server拉取镜像运行容器 2. 卸载SQL Server3. 开放端口4. 常用命令5. 使用Navicat Premium连接 1. 安装SQL Server 拉取镜像 sudo docker pull mcr.microsoft.com/mssql/server:2017-latest运行容器 创建挂载点目录 mkdir /home/sqlserver_data运行容器…

漏洞复现--天融信TOPSEC两处远程命令执行

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

【Nodejs】基于node http模块的博客demo代码实现

目录 package.json www.js db.js app.js routes/blog.js controllers/blog.js mysql.js responseModel.js 无开发&#xff0c;不安全。 这个demo项目实现了用Promise异步处理http的GET和POST请求&#xff0c;通过mysql的api实现了博客增删改查功能&#xff0c;但因没有…

Unity3D DOTS如何基于ECS的骨骼动画播放与切换 详解

前言 Unity3D DOTS&#xff08;Data-Oriented Technology Stack&#xff09;是Unity引擎的一套新的技术堆栈&#xff0c;旨在优化游戏的性能和可伸缩性。其中&#xff0c;ECS&#xff08;Entity Component System&#xff09;是一种新的编程模型&#xff0c;用于处理游戏中的实…

【KingbaseES】实现MySql函数WEERDAY

CREATE OR REPLACE FUNCTION weekday(date_val date) RETURNS integer AS $$ BEGIN RETURN EXTRACT(ISODOW FROM date_val); END; $$ LANGUAGE plpgsql IMMUTABLE;