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

java 第19天 Lambda、jdk8.0新方法、Optional

一.Lambda表达式

前提是:参数是函数式接口才可以书写Lambda表达式

函数式接口条件: 1.接口  2.只有一个抽象方法 

lambda表达式又称为匿名函数,允许匿名函数以参数的形式传入方法,简化代码

lambda表达式分为两部分()->{}

():要被覆盖的抽象方法的参数列表

如果参数只有一个的话()可以省略

{}:要被覆盖的抽象方法的方法体

如果方法体中只有一条语句{}和; 和 return省略

lambda中的return取决于抽象方法的返回类型

以下是关于lambda表达式的练习

(1.)TreeSet的一个构造方法可以使用 如下

TreeSet<>(Comparator接口 有一个抽象方法 compare(T x,T y)); 

		TreeSet<Integer> set = new TreeSet<>((x, old)->old - x);Collections.addAll(set,45,23,100,98);

(2).Collections.sort(list,Comparator) 也可以使用

		ArrayList<Integer> list=new ArrayList<>();Collections.addAll(list,45,23,100,98);//对list按照个位数升序/*Collections.sort(list,(n,old)->{return n%10-old%10;});*/Collections.sort(list,(n,old)->n%10-old%10);

(3)Collections.min(list,Comparator)  根据名字长度升序并且拿到第一个元素

Student stu=Collections.min(set,(n,old)->{return n.getName().length()-old.getName().length();});
Student stu=Collections.min(set,(n,old)-> n.getName().length()-old.getName().length());System.out.println(stu);

二.JDK8.0 新方法

(1.)对于list集合的

list.sort(Comparator<>); 可在比较器中设置比较规则 也可用lambda表达式 如下

其中里面的x.compareTo是泛型自身的比较规则

list.sort((x,y)->{return x.compareTo(y);});

 总结对list的排序

List 去排序
Collections . sort ( List )
Collections . sort ( List , Comparator )
list . sort ( Comparator )
TreeSet set = new TreeSet ( List 对象 );

 (2)Collection提供

forEach(Consumer):  

单值集合对象 . forEach (( x ) -> { 逻辑 });

引入了四大接口之一的-----------消费型接口 只会进去 不会出来返回类型void

接口:interface Consumer<泛型>()
唯一的抽象方法: void accept(泛型 x);
使用如下:
获取学生的年龄 并且加1
		set.forEach((stu)->{stu.setAge(stu.getAge()+1);});
	set.forEach((temp)->{temp.setScore(temp.getScore()+5);});

所谓的forEach中的小括号就是拿出集合中每一个数据罢了,如果是学生集合,对应的拿出的就是单独一个学生

removeIf(Predicate):删除集合里面所有符合条件的元素 调用如下

单值集合对象.removeIf(  (x)->{return 条件判断;})

四大接口之一---断言型接口

接口:interface Predicate<T >{}

唯一的抽象方法: boolean test(泛型 x);

练习removeIf,符合条件的就删除了

		//删除20岁的Jackerset.removeIf((temp)->{return temp.getName().equals("Jacker")&&temp.getAge()==20;});

(3).为map提供的方法

forEach(BiConsumer) 拿出集合中的每个对象进行某种操作

map.forEach((key,value)->{逻辑});

三.方法的引用

jdk8.0的新语法 对lambda表达式进行了进一步简化

之前

对象.实例方法()  

对象.静态方法()

类名.静态方法()

new 构造方法()

可以被一下替换

【对象::实例方法】

必须同时满足的两个条件
1 要被覆盖的抽象方法的参数列表和实例方法的参数列表一致
2 要被覆盖的抽象方法的返回类型和实例方法的返回类型一致
		// 抽象方法:void accept(Integer)// 实例方法:void println(Integer)list.forEach(System.out::println);// list.forEach((x)->System.out.println(x));

但是下面的不行

		Map<String,Integer> map = new HashMap<>();map.put("黄一亿",59);map.put("可可可",59);// 1 要被覆盖的抽象方法的参数列表和实例方法的参数列表一致
// 2 要被覆盖的抽象方法的返回类型和实例方法的返回类型一致// 抽象方法:void accept(String,Integer)// 实例方法:void println(String)// 1 X 2 √map.forEach((k,v)->System.out.println(k+v));

【类名::实例方法】

必须同时满足的三个条件
1 要被覆盖的抽象方法的参数列表比实例方法的参数列表多一个
2 要被覆盖的抽象方法的第一个参数可以调用实例方法
3 要被覆盖的抽象方法的返回类型和实例方法的返回类型一致
		//抽象方法: int compare(Student x,Student y)//实例方法; int compareTo(Student y)//11.抽象方法的参数比实例方法多一个//22.抽象方法的第一个 参数可以调用---升序可以 降序不OK//33.抽象方法的返回类型和实例方法的返回类型一致//1 √ 2 √ 3.√list.sort((x,y)->{return x.compareTo(y);});list.sort(Student::compareTo);

类名::静态方法

【构造方法::new

1 要被覆盖的抽象方法的参数列表和构造方法的参数列表一致
2 要被覆盖的抽象方法的返回类型和构造方法的返回类型一致
		Student stu = null;stu = Optional.ofNullable(stu) // Optional<Student>// 构造方法:Student Student()// 抽象方法:Student get()// 参数列表一致// 返回类型一致// 构造方法::new// .orElseGet(()->new Student());.orElseGet(Student::new);System.out.println(stu);

四.Optional 容器类

jdk8.0之后出现的致力于解决空指针问题
首先认识of(元素)---认识不掌握 不好用一点都不好
of( 元素 )
如果元素非空 直接返回包含元素的 Optional 对象
如果元素是 null 直接空指针
get()--------------------------------垃圾 不掌握
如果容器不是空容器 取出容器中的元素
如果容器是空容器 Optional.empty 直接报错【 NoSuchElementException
【结合 isPresent() 使用】
isPresent() 不是空容器 -true Optional.empty-false
ifPresent ( Consumer )
如果容器非空 会调用匿名函数
如果容器时 Optional . empty 不执行匿名函数

对于元素的放用ofNullable---以下掌握

ofNullable( 元素 )
如果元素非空 直接返回包含元素的 Optional 对象
如果元素为空 直接返回 Optional.empty 空元素
        String str = "hello";Optional<String> op = Optional.ofNullable(str);System.out.println(op); 打印 helloString str = null;Optional<String> op = Optional.ofNullable(str);System.out.println(op);  打印Optional.empty

搭配上取 

orElse(类型 x) x => 如果Optional.empty 使用x

如果容器非空 直接返回容器中的内容
使用如下:
如果str为空则为 no value,不为空则为原来值
str = Optional.ofNullable(str).orElse("No Value");

orElseGet(Suppler<T> ss)

orElseGet (() -> { return xxx ;})
如果容器非空 直接返回容器中的内容
如果 Optional . empty 使用 x 调用匿名函数【 lambda 的版本】
区别: orElseGet 惰性执行

四大接口之一----供给型接口 只提供 不接收

接口: interface Supplier< 泛型 >{}
唯一的抽象方法:泛型 get()
        String str = null;str = Optional.ofNullable(str)// Optional<String>// 抽象方法:String get().orElseGet(()->"No Value");System.out.println(str);

类名::构造方法

		Student stu = null;stu = Optional.ofNullable(stu) // Optional<Student>// 构造方法:Student Student()// 抽象方法:Student get()// 参数列表一致// 返回类型一致// 构造方法::new// .orElseGet(()->new Student());.orElseGet(Student::new);System.out.println(stu);

相关文章:

java 第19天 Lambda、jdk8.0新方法、Optional

一.Lambda表达式 前提是&#xff1a;参数是函数式接口才可以书写Lambda表达式 函数式接口条件&#xff1a; 1.接口 2.只有一个抽象方法 lambda表达式又称为匿名函数&#xff0c;允许匿名函数以参数的形式传入方法&#xff0c;简化代码 lambda表达式分为两部分()->{} …...

江协科技STM32学习- P31 I2C通信协议

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

6、liunx目录的功能

一、目录简介 Linux主要树结构目录包括&#xff1a;/、/root、/home、/usr、/bin、/tmp、/sbin、/proc、/boot 【Linux系统中常见目录功能如下】 / 根目录&#xff1b;/bin 存放必要的命令&#xff1b;&#xff08;普通用户&#xff09; /boot 存放内核以及启动所需的文件&…...

挑战Java面试题复习第5天,无人扶我青云志

挑战第 5 天 java反射List Set Map 区别Object 常用方法 java反射 定义&#xff1a; 运行时动态获取类信息和调用方法的特性。 应用场景&#xff1a; JDBC数据库连接。框架如Hibernate和Struts等。 实现方式&#xff1a; 通过四种方法获取Class对象&#xff1a; Class.fo…...

大规模语言模型:从理论到实践(1)

1、绪论 大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;是由包含数百亿以上参数的深度神经网络构建的语言模型&#xff0c;采用自监督学习方法通过大量无标注文本进行训练。自2018年以来&#xff0c;多个公司和研究机构相继发布了多种模型&#…...

C#如何锁定和解除鼠标及键盘BlockInput

在C#中&#xff0c;"BlockInput"通常指的是一个功能或方法&#xff0c;用于阻止或暂停用户输入一段时间。这在某些特定的应用场景下非常有用&#xff0c;比如在游戏中防止玩家连续快速点击导致游戏逻辑错误&#xff0c;或者在UI应用中防止用户在某个操作正在进行时进…...

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域&#xff0c;我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer&#xff08;MMDiT&#xff09;驱动的文本到图像模型&#xff0c;它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…...

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10&#xff1a; 这个语句的意思是&#xff0c;从查询结果中跳过前100000条记录&#xff0c;然后返回接下来的10条记录。这通常用于分页查询中&#xff0c;当你需要跳过大量的记录以获取后续的记录时。例如&#xff0c;如果你…...

RabbitMQ 实现消息队列负载均衡

在现代应用程序中&#xff0c;消息队列是一种重要的架构模式&#xff0c;用于解耦服务、处理异步任务和实现负载均衡。其中&#xff0c;RabbitMQ是一个广泛使用的开源消息代理&#xff0c;提供了高可用性、可靠性和灵活性。本文将展示如何使用Python及其pika库来实现RabbitMQ&a…...

嵌入式linux中HTTP协议原理基本分析

第一:HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维…...

thinkphp和vue基于Workerman搭建Websocket服务实现用户实时聊天,完整前后端源码demo及数据表sql

最近接了一个陪玩小程序&#xff0c;其中有一个实时聊天的项目&#xff0c;需要搭建Websocke服务&#xff0c;通过多方考虑选择了通过GatewayWorker框架&#xff08;基于Workerman&#xff09;,将代码提取了出来&#xff0c;用到的框架封装到了vendor目录下&#xff0c;完整前后…...

浅谈射频应用

射频&#xff08;Radio Frequency&#xff0c;缩写为RF&#xff09;是一种高频交流变化电磁波的简称&#xff0c;其频率范围广泛&#xff0c;从几十千赫兹跨越至几百吉赫兹。射频技术在多个领域有着广泛的应用&#xff1a; 1、通信领域&#xff1a;射频技术是现代通信领域的重要…...

SAP(PP生产制造)拆解工单业务处理

1、BOM维护 要拆解的成品或半成品要和原成品、半成品BOM一致 2、创建拆解工单 CO01选择拆解工单的类型&#xff0c;以及填写拆解的物料和拆解工厂 维护工单组件 注意&#xff1a; 1、拆解入库组件的数量需要维护为负数 2、拆解工单投料组件数量维护为正数 3、拆解工单收发…...

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作&#xff1a;点击按键和释放按键&#xff0c;也就是按键按下和松开。按键按下的对应的事件是KEYDOWN&#xff0c;按键松开对应…...

deque

deque 底层数据结构 动态开辟的二维数组第一维数组中存放的是第二维数组的指针每个第二维数组大小为512字节。假如存放的是**_Tp类型,每个第二维数组存放512/(sizeof(_Tp**))个元素按照第一维数组大小二倍进行扩容 举例 当deque进行push_back&#xff0c;将下半部分空间元素…...

YOLOv11改进策略【卷积层】| CVPR-2020 Strip Pooling 空间池化模块 处理不规则形状的对象 含二次创新

一、本文介绍 本文记录的是利用Strip Pooling模块优化YOLOv11的目标检测网络模型。Strip Pooling结合了长而窄的卷积核形状在一个空间维度上的长程关系捕捉能力和在另一个空间维度上的局部细节捕捉能力,有效地处理复杂的场景信息。这一机制通过采用 1 N 1N 1N或 N 1 N1 N1的…...

yt-dlp下载视频

插件官方下载地址 通过以下命令行使用 yt-dlp下载 (base) D:\tool\video>cd D:\tool\video (base) PS D:\tool\video> .\vdownlod.bat 此处输入链接或者(base) D:\tool\video>yt-dlp -f bv[extmp4]ba[extm4a] --cookies d:\Downloads\www.youtube.com_cookies.txt -…...

oracle insert忽略主键冲突,忽略重复记录

在INSERT语句中使用IGNORE_ROW_ON_DUPKEY_INDEX提示&#xff1a; INSERT /* IGNORE_ROW_ON_DUPKEY_INDEX(table_name, index_name) */ INTO table_name(column1, column2) VALUES(value1, value2); 或 INSERT /* IGNORE_ROW_ON_DUPKEY_INDEX(table_name(column_name)) */ …...

小新学习k8s第四天之发布管理

一、金丝雀发布&#xff08;灰度发布&#xff09; Deployment控制器支持自定义控制更新过程中的滚动节奏&#xff0c;如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程&#xff0c;此时&#xff0c;仅存在一部分新版本的…...

01_IAR新建CC2530工程

IAR建立CC2530工程 前言 ​ 由于很多Zigbee商家提供的教程未有从零建立CC2530工程的讲解&#xff0c;可能会导致后面的开发中出现一些琐碎的问题。本文将以LED流水灯为例&#xff0c;从0到1用IAR建立CC2530工程。 IAR介绍 ​ IAR Embedded Workbench被广泛应用于消费电子、…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...