java_Lambda表达式

1、背景

lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式和一个代码块)。Lambda表达式,基于数学中的λ演算得名,也可成为闭包。

1.1 Lambda表达式的语法

基本语法:(parameters)-> expression 或 (parameters)->{statements;}

Lambda表达式由三部分组成:

1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。

2. ->:可理解为被用于的意思

3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

1.2函数式接口

要了解lambda表达式,首先要了解函数式接口,函数式接口的定义:一个接口有且只有一个方法。

注意: 

1、如果一个接口有且只有一个抽象方法,那么该接口是函数式接口。

2、保障该接口是函数式接口:如果我们在一个接口上声明了@FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果该接口中有两个抽象方法,程序编译就会报错的。

如图所示,为一个函数式接口:

如果多一个方法,此时注解就会报错。 

我们之前在抽象类和接口-CSDN博客中讲到:在jdk1.8之后,接口中的default方法可以有具体实现,如果添加进去,该接口任然为函数式接口。

2、lambda表达式的基本使用

在我们之前的文章 Map&Set 4 面试题汇总 _map的面试题-CSDN博客中,有这么一道题:692. 前K个高频单词 - 力扣(LeetCode),它需要建一个小根堆,之前我们使用匿名内部类完成,下面,我们通过lambda表达式进行完成。

匿名内部类代码如下:

public class Test {public static void main(String[] args) {PriorityQueue<Map.Entry<String,Integer>> priorityQueue = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {return o1.getValue()-o2.getValue();}});}
}

lambda表达式代码:

public class Test {public static void main(String[] args) {PriorityQueue<Map.Entry<String,Integer>> priorityQueue = new PriorityQueue<>((Map.Entry<String,Integer> o1,Map.Entry<String,Integer> o2) ->{return o1.getValue() - o2.getValue();});}
}

到了这里相信大家已经对lambda表达式有了初步认识,下面我们通过完成一些lambda表达式的练习,对lambda表达式的使用进行巩固。

首先先准备好如下函数式接口,然后尝试在main方法中使用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);
}

实现:

  public static void main(String[] args) {NoParameterNoReturn noParameterNoReturn = () -> System.out.println("hello,world");OneParameterNoReturn oneParameterNoReturn = (a) -> System.out.println(a);MoreParameterNoReturn moreParameterNoReturn = (a, b) -> System.out.println(a+b);NoParameterReturn noParameterReturn = ()-> {return 0;};OneParameterReturn oneParameterReturn = (a) -> {return a;};MoreParameterReturn moreParameterReturn = (a, b) -> {return a+b;};}

测试:

2.1 语法精简

1、参数类型可以省略,如果需要省略,每个参数的类型都有省略。

2、参数的小括号里面只有一个参数,那么小括号可以省略。

3、如果方法体当中只有一句代码,则大括号可以省略

4、如果方法体中只有一条语句,而且是return语句,那么大括号可以省略,且去掉return关键字。

 示例代码:

 public static void main(String[] args) {//  1.参数类型可以省略,如果需要省略,每个参数的类型都有省略。MoreParameterNoReturn moreParameterNoReturn = (a,b) -> System.out.println(a+b);//  2.参数的小括号里面只有一个参数,那么小括号可以省略。OneParameterNoReturn oneParameterNoReturn = a -> {System.out.println(a);};// 3.如果方法体当中只有一句代码,则大括号可以省略NoParameterNoReturn noParameternoReturn = ()-> System.out.println("hello world");// 4.如果方法体中只有一条语句,而且是return语句,那么大括号可以省略,且去掉return关键字NoParameterReturn noParameterReturn = () -> 0;}

3、变量捕获

Lambda表达式中存在变量捕获,了解了变量捕获之后,才能更好的理解Lambda表达式的作用域。

3.1 匿名内部类的变量捕获

下面通过代码来展示匿名内部类中的变量捕获:

首先,有这么一个接口:

interface NoParameterNoReturn {void test();
}

实现的匿名内部类如下:

public static void main(String[] args) {int a = 10;new NoParameterNoReturn(){@Overridepublic void test() {System.out.println(a);}}.test();}

此时,点击运行,代码是能够正常执行的:

那如果我们在内部类中修改当前a的值为99,它还能够正常运行吗?

 可以看到,程序报错。这就是匿名内部类的变量捕获,也就是说:传入匿名内部类中的量,必须是常量或者没有改变过值的量。

3.2 lambda表达式的变量捕获

lambda表达式也存在变量捕获机制,和上面的匿名内部类同理:

4、Lambda表达式在集合中的使用

为了能够让 Lambda Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与Lambda表达式对接。

以上方法的作用可自行查看java帮助手册,这里进行一些方法的使用示例。

注意:Collection的forEach方法是从接口java.lang.Iterable拿过来的。

4.1 List接口

foreach方法和Sort方法

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");list.add("abc");list.add("adc");System.out.print("排序前的结果: ");list.forEach((s -> System.out.print(s + " ")));System.out.println();System.out.print("排序后的结果: ");list.sort((o1,o2)->o1.compareTo(o2));list.forEach(s -> System.out.print(s + " "));}

 4.2 Map接口

foreach方法

    public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();map.put("hello",4);map.put("abv",3);map.put("666",6);map.forEach((s, integer) -> System.out.println("key: "+s+" val: "+integer));}

5、总结

lambda表达式:

优点 :

1、代码简洁,开发迅速

2、方便函数式编程

3、非常容易进行并行计算

缺点:

1、代码可读性变差

2、在非并行计算中,很多计算未必有传统的for性能高

3、不容易进行调试

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

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

相关文章

给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放

实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6

实验-组合电路设计1-全加器和加法器(数字逻辑)

目录 一、实验内容 二、实验步骤 2.1 全加器的设计 2.2 加法器的设计 三、调试过程 3.1 全加器调试过程 2.加法器的调试过程 四、实验使用环境 五、实验小结和思考 一、实验内容 a) 介绍 在这次实验中&#xff0c;你将熟悉 Logisim 的操作流程&#xff0c;并且学习…

Linux进程控制与替换详解

进程创建 fork函数初识 在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核做: • 分配新的内存块和内核数据结构给子进程 • 将父进程部分数据结构内容拷贝至…

Vue3学习笔记2——路由守卫

路由守卫 全局 router.beforeEach((to, from, next) > {})router.afterEach((to, from, next) > {}) 组件内守卫 beforeRouteEnter((to, from, next) > {})beforeRouteUpdate((to, from, next) > {})beforeRouteLeave((to, from, next) > {}) 路由独享 be…

AI与无人零售:如何通过智能化技术提升消费者体验和运营效率?

引言&#xff1a;无人零售不只是无人值守 你走进一家无人便利店&#xff0c;没有迎宾、没有收银员&#xff0c;甚至没有一个人在场&#xff0c;但你刚拿起商品&#xff0c;货架旁的摄像头就悄悄“看懂”了你的动作&#xff0c;系统已经在后台为你记账。你以为只是没人管&#x…

如何在3dMax中使用UVW展开修改器?

UVW展开(Unwrap UVW)修改器是3dmax中的一个强大工具,允许对纹理如何应用于3D模型进行精确控制。 与更简单的UVW Map修改器不同,Unwrap UVW修改器提供了高级选项,用于手动编辑纹理映射,对于详细和复杂的模型来说是必不可少的。 在本文中,我们将探讨增强您对Unwrap UVW修…

【Linux】进程优先级与进程切换理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、进程优先级 1. 什么是进程优先级 2. 为什么有进程优先级 3. 进程优先级的作用 4. Linux进程优先级的本质 5. 修改进程优先级 二、进…

【Hive入门】Hive高级特性:事务表与ACID特性详解

目录 1 Hive事务概述 2 ACID特性详解 3 Hive事务表的配置与启用 3.1 启用Hive事务支持 3.2 创建事务表 4 Hive事务操作流程 5 并发控制与隔离级别 5.1 Hive的锁机制 5.2 隔离级别 6 Hive事务的限制与优化 6.1 主要限制 6.2 性能优化建议 7 事务表操作示例 7.1 基本…

二叉树算法精解(Java 实现):从遍历到高阶应用

引言 二叉树&#xff08;Binary Tree&#xff09;作为算法领域的核心数据结构&#xff0c;在搜索、排序、数据库索引、编译器语法树构建等众多场景中都有着广泛应用。无论是初学者夯实算法基础&#xff0c;还是求职者备战技术面试&#xff0c;掌握二叉树相关算法都是不可或缺的…

ES6入门---第二单元 模块二:关于数组新增

一、扩展运算符。。。 1、可以把ul li转变为数组 <script>window.onloadfunction (){let aLi document.querySelectorAll(ul li);let arrLi [...aLi];arrLi.pop();arrLi.push(asfasdf);console.log(arrLi);};</script> </head> <body><ul><…

Nature正刊:新型折纸启发手性超材料,实现多模式独立驱动,变形超50%!

机械超材料是一种结构化的宏观结构&#xff0c;其几何排列方式具有独特的几何结构&#xff0c;从而具有独特的力学性能和变形模式。超材料的宏观特性取决于中观尺度晶胞的具体形状、尺寸和几何取向。经典的结构化晶胞&#xff0c;例如以拉伸为主的八面体桁架单元和以弯曲为主的…

Servlet(二)

软件架构 1. C/S 客户端/服务器端 2. B/S 浏览器/服务器端&#xff1a; 客户端零维护&#xff0c;开发快 资源分类 1. 静态资源 所有用户看到相同的部分&#xff0c;如&#xff1a;html,css,js 2. 动态资源 用户访问相同资源后得到的结果可能不一致&#xff0c;如&#xff1a;s…

循环缓冲区

# 循环缓冲区 说明 所谓消费&#xff0c;就是数据读取并删除。 循环缓冲区这个数据结构与生产者-消费者问题高度适配。 生产者-产生数据&#xff0c;消费者-处理数据&#xff0c;二者速度不一致&#xff0c;因此需要循环缓冲区。 显然&#xff0c;产生的数据要追加到循环缓…

嵌入式硬件篇---STM32 系列单片机型号命名规则

文章目录 前言一、STM32 型号命名规则二、具体型号解析1. STM32F103C8T6F103:C:8:T6:典型应用2. STM32F103RCT6F103:R:C:T6:典型应用三、命名规则扩展1. 引脚数与封装代码2. Flash 容量代码3. 温度范围代码四、快速识别技巧性能定位:F1/F4后缀差异硬件设计参考:引脚数…

MySQL 中日期相减的完整指南

MySQL 中日期相减的完整指南 在 MySQL 中&#xff0c;日期相减有几种不同的方法&#xff0c;具体取决于你想要得到的结果类型&#xff08;天数差、时间差等&#xff09;。 1. 使用 DATEDIFF() 函数&#xff08;返回天数差&#xff09; SELECT DATEDIFF(2023-05-15, 2023-05-…

传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本

​【早期经典版本】 1.10 三英雄传说&#xff1a;2001 年 9 月 28 日热血传奇正式开启公测&#xff0c;这是传奇的第一个版本。游戏中白天与黑夜和现实同步&#xff0c;升级慢&#xff0c;怪物爆率低&#xff0c;玩家需要靠捡垃圾卖金币维持游戏开销&#xff0c;遇到高级别法师…

重塑数学边界:人工智能如何引领数学研究的新纪元

目录 一、人工智能如何重新定义数学研究的边界 &#xff08;一&#xff09;数学与AI的关系&#xff1a;从基础理论到创新思维的回馈 &#xff08;二&#xff09;AI的创造力&#xff1a;突破传统推理的局限 &#xff08;三&#xff09;AI对数学研究的潜在贡献&#xff1a;创…

IP伪装、代理池与分布式爬虫

一、动态代理IP应用&#xff1a;代理池的获取、选择与使用 代理池技术的核心是通过动态切换IP地址&#xff0c;让爬虫看起来像不同用户在访问网站&#xff0c;从而规避封禁。 &#xff08;一&#xff09;代理池的获取途径 1. 免费代理&#xff1a;低成本但高风险 免费代理可…

自然语言处理实战:用CRF打造高精度命名实体识别系统

## 一、从标签游戏到智能系统:命名实体识别的前世今生 在信息爆炸的互联网时代,我们每天面对的海量文本中隐藏着无数有价值的信息。想象一下,当你在浏览新闻时,系统能自动标红所有人名、地点和机构名称——这就是命名实体识别(NER)技术的魔力。从早期的规则匹配到如今的…

Space Engineers 太空工程师 [DLC 解锁] [Steam] [Windows]

Space Engineers 太空工程师 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明 DLC 解锁列表&…