【Java SE】Lambda表达式
目录
♫什么是Lambda表达式
♫Lambda表达式的语法
♫函数式接口
♫Lambda表达式的使用
♫变量捕获
♫ Lambda表达式在集合中的使用
♪Collection的foreach():
♪List的sort():
♪Map的foreach()
♫什么是Lambda表达式
Lambda 表达式是 Java SE 8中一个重要的新特性,它是一种匿名函数,常作为函数式编程的一部分,用于向函数传递行为作为参数,或者用于将行为作为返回值返回。 Lambda表达式提供了一个正常的参数列表和一个使用这些参数的主体(body, 可以是一个表达式或一个代码块)。
♫Lambda表达式的语法
基本语法 : (parameters) ->{ 方法体 }①. paramaters :类似方法中的形参列表,这里的参数是函数式接口里的参数。(参数类型可以明确的声明 ,也可不声明而由 JVM 隐含的推断;当只有一个推断类型时可以省略掉圆括号)②. -> :可理解为 “ 被用于 ” 的意思③. 方法体 :可以是表达式也可以代码块,是函数式接口里方法的实现。(代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体;如果是表达式,也可以返回一个值或者什么都不反回)//1. 不需要参数,返回值为2 ()->2; //2. 接收一个参数(数字类型),返回其2倍的值 x->2*x; //3. 接受2个参数(数字),并返回他们的和 (x,y)->x+y; //4. 接收2个int型整数,返回他们的乘积 (int x,int y)->x*y; //5. 接受一个string对象,并在控制台打印,不返回任何值 (String s)->System.out.print(s);注:①.->前只有一个参数,()可以省略;②.->后只有一条语句,{}可以省略;③.->后只有return语句,return可以去掉;④.()里 的参数类型可以省略,如果要省略,每个参数的类型都要省略。
♫函数式接口
要了解 Lambda 表达式 , 还需要先了解什么是函数式接口。函数式接口是一种特殊的接口,它的接口里有且只有一个抽象方法:@FunctionalInterface interface A {//抽象方法有且只有一个public void fun();//可以有被default修饰的具体方法default void fun2() {System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");} }注:
①.如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。
②.可以在接口上方加上@FunctionalInterface注释,让编译器帮助我们检查该接口是不是一个函数式接口。
③.JDK1.8之后,函数式接口里允许存在default方法修饰的具体方法。
♫Lambda表达式的使用
我们先定义几个函数式接口:
//无返回值无参数 @FunctionalInterface interface NoParameterNoReturn {void test(); } //无返回值一个参数 @FunctionalInterface interface OneParameterNoReturn {void test(int a); } //无返回值多个参数 @FunctionalInterface interface MoreParameterNoReturn {void test(int a,int b); }//有返回值无参数 @FunctionalInterface interface NoParameterReturn {int test(); } //有返回值一个参数 @FunctionalInterface interface OneParameterReturn {int test(int a); }//有返回值多参数 @FunctionalInterface interface MoreParameterReturn {int test(int a,int b); }下面我们通过Lambda表达式对上面几个函数式接口进行实例化操作:
public class Test {public static void main(String[]args) {//无参数无返回值NoParameterNoReturn noParameterNoReturn = () -> {System.out.println("无参数无返回值");};noParameterNoReturn.test();//一个参数无返回值OneParameterNoReturn oneParameterNoReturn = (int a) -> {System.out.println("一个参数无返回值:" + a);};oneParameterNoReturn.test(10);//多个参数无返回值MoreParameterNoReturn moreParameterNoReturn = (int a, int b) -> {System.out.println("多个参数无返回值:" + a + "" + b);};moreParameterNoReturn.test(20, 30);//有返回值无参数NoParameterReturn noParameterReturn = () -> {System.out.println("有返回值无参数");return 40;};int ret = noParameterReturn.test();System.out.println(ret);//有返回值有一个参数OneParameterReturn oneParameterReturn = (int a) -> {System.out.println("有返回值有一个参数");return a;};ret = oneParameterReturn.test(50);System.out.println(ret);//有返回值多个参数MoreParameterReturn moreParameterReturn = (int a, int b) -> {System.out.println("有返回值多个参数");return a + b;};ret = moreParameterReturn.test(60, 70);System.out.println(ret);} }注:Lambda表达式只能应用于函数式接口。
♫变量捕获
变量捕获是指将外部类中的变量复制到内部类中,这样内部类就可以在外部类的作用域之外访问这些变量。
匿名内部类和lambda表达式都存在变量捕获:
@FunctionalInterface interface B {void fun(); } public class Test {public static void main(String[] args) {int a = 10;//匿名内部类:B b1 = new B() {@Overridepublic void fun() {System.out.println("匿名内部类a=" + a);}};b1.fun();//Lambda表达式:B b2 = () -> {System.out.println("Lambda表达式a=" + a);};b2.fun();} }运行结果如下:
需要注意的是:被捕获的变量要么是被final修饰,要么是隐式 final 的(在使用之前没有被修改):
@FunctionalInterface interface B {void fun(); } public class Test {public static void main(String[] args) {int a = 10;//a = 11;//①//匿名内部类:B b1 = new B() {@Overridepublic void fun() {//a = 11;//②System.out.println("匿名内部类a=" + a);}};b1.fun();//a = 11;//③} }在①、②、③任意一处去掉注释都会报错:![]()
♫ Lambda表达式在集合中的使用
为了能够让 Lambda 和 Java 的集合类集更好的一起使用,Java集合中新增了部分接口,以便与 Lambda 表达式对接:
接口 新增方法 Collection removeIf()、spliterator()、stream()、parallelStream()、forEach() List replaceAll()、sort()Map getOrDefault()、forEach()、replaceAll()、putIfAbsent()、remove()、replace()、computeIfAbsent()、computeIfPresent()、compute()、merge()♪Collection的foreach():
foreach()的部分源码:
foreach()的应用:
public class Test {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(3);list.add(2);list.forEach(s-> System.out.print(s+" "));} }运行结果:
♪List的sort():
sort()的部分源码:
sort()的应用:
class Test2 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(3);list.add(2);list.sort((str1,str2)->str1-str2);System.out.println(list);}}运行结果:
♪Map的foreach()
foreach()的部分源码:
foreach()的应用:
class Test3 {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("a", 1);map.put("b", 2);map.put("c",3);map.forEach((k,v)->System.out.println(k+"="+v));} }运行结果:
相关文章:
【Java SE】Lambda表达式
目录 ♫什么是Lambda表达式 ♫Lambda表达式的语法 ♫函数式接口 ♫Lambda表达式的使用 ♫变量捕获 ♫ Lambda表达式在集合中的使用 ♪Collection的foreach(): ♪List的sort(): ♪Map的foreach() ♫什么是Lambda表达式 Lambda 表达式是 Java SE 8中一个…...
Kafka-UI
有多款kafka管理应用,目前选择的是github上star最多的UI for Apache Kafka。 关于 To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself. UI for Apache Kafka is a versatile, fast, and lightweight…...
Unity 制作登录功能02-创建和链接数据库(SQlite)
国际惯例:先看效果 1.SQlite是一种嵌入型数据库 在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因: 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非…...
算法 岛屿数量-(递归回溯)
牛客网 BM57. 二维矩阵,值为1表示岛屿,0表示海洋,求海洋中岛屿数量。 解题思路: 遍历二维数组,值为1增加岛屿数量记数,同时对此位置进行单独递归遍历上下左右4个方向,将数组坐标范围内同时值为1的元素置…...
安卓恶意应用识别(番外篇)(Python并行(多线程or多进程)执行cmd)
前言 本人为了批量反编译,不得不涉及到批量执行,之前没有彻底理解有关于多线程的概念和python方法,现在只能一步一步尝试,并且实践,写本文以记录。 1. 进程与线程 1.1 什么是进程? 1.1.1 概念 进程是一…...
基于大语言模型扬长避短架构服务
秘诀: 扬泛化之长, 避时延之短...
初识网络编程
一、概述 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现 TCP和UDP: TCP:打电话 -->连接 -->接了 -->通话 UDP:发送完即可 -->接收 计算机网络&a…...
轻松使用androidstudio交叉编译libredwg库
对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…...
【C++杂货铺】一颗具有搜索功能的二叉树
文章目录 一、二叉搜索树概念二、二叉搜索树的操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除 三、二叉搜索树的实现3.1 BinarySearchTreeNode(结点类)3.2 BinarySearchTree(二叉搜索树类)3.2.1 框架3.2.2 in…...
uni-app使用vue3,在元素或组件实例上添加ref,用this.$refs显示undefined
项目中引用了一个UI组件库,在表单上添加了ref属性,方便提交时验证。触发提交方法时显示不存在这个方法或this.$refs为undefined。 <u--form labelPosition"left" :model"userInfo" :rules"rules" ref"loginForm&…...
蜂蜜配送销售商城小程序的作用是什么
蜂蜜是农产品中重要的一个类目,其受众之广市场需求量大,但由于非人人必需品,因此传统线下门店经营也面临着痛点,线上入驻平台也有很多限制难以打造自有品牌,无法管理销售商品及会员、营销等,缺少自营渠道&a…...
大数据Flink(八十四):SQL语法的DML:窗口聚合
文章目录 SQL语法的DML:窗口聚合 一、滚动窗口(TUMBLE)...
系统集成|第十八章(笔记)
目录 第十八章 安全管理18.1 信息安全管理18.2 信息系统安全18.3 物理安全管理18.4 人员安全管理18.5 应用该系统安全管理18.6 信息安全等级保护18.7 拓展 上篇:第十七章、变更管理 下篇:第十九章、风险管理 第十八章 安全管理 18.1 信息安全管理 信息安…...
480万商品,如何架构商品治理平台?
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板。 最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架…...
【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?
【C入门指南】C如何过渡到C?祖师爷究竟对C做了什么? 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…...
简易磁盘自动监控服务
本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况,一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息,需要邮件接收客户都安开启SMTP服务。简要流程请参考下…...
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块,用于绘制和可视化三维图形,包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…...
十六,镜面IBL--预滤波环境贴图
又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分,镜面反射。 其中 这里很棘手,与输入wi和输出w0都有关系,所以,再近似 其中第一部分,就是预滤波环境贴图,形式上与前面的辐照度图很相似&#…...
信息安全:恶意代码防范技术原理.
信息安全:恶意代码防范技术原理. 恶意代码的英文是 Malicious Code, 它是一种违背目标系统安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。 目录: 恶意代码概述: (1&a…...
开源媒体浏览器Kyoo
什么是 Kyoo ? Kyoo 是一款开源媒体浏览器,可让您流式传输电影、电视节目或动漫。它是 Plex、Emby 或 Jellyfin 的替代品。Kyoo 是从头开始创建的,它不是一个分叉。一切都将永远是免费和开源的。 软件特性: 管理您的电影、电视剧…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
PLC入门【4】基本指令2(SET RST)
04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C),从 文件 - 主画面,“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...





