java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解

news2024/11/23 15:50:58

Optional类

到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。

  1. Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
  2. Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在 则isPresent()方法会返回true,调用get()方法会返回该对象。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

创建Optional类对象的方法:

Optional.of(T t) : 创建一个 Optional 实例,t必须非空;

Optional.empty() : 创建一个空的 Optional 实例

Optional.ofNullable(T t):t可以为null

判断Optional容器中是否包含对象:

boolean isPresent() : 判断是否包含对象

void ifPresent(Consumer consumer) :如果有值,就执行Consumer 接口的实现代码,

并且该值会作为参数传给它。

获取Optional容器的对象:

T get(): 如果调用对象包含值,返回该值,否则抛异常

T orElse(T other) :如果有值则将其返回,否则返回指定的other对象。

T orElseGet(Supplier other) :如果有值则将其返回,否则返回由 Supplier接口实现提供的对象。

T orElseThrow(Supplier exceptionSupplier) :如果有值则将其返 回,否则抛出由Supplier接口实现提供的异常。

代码示范

@Test
public void test1() {
Boy b = new Boy("张三");
Optional<Girl> opt = Optional.ofNullable(b.getGrilFriend());
// 如果女朋友存在就打印女朋友的信息
opt.ifPresent(System.out::println);
}
@Test
public void test2() {
Boy b = new Boy("张三");
Optional<Girl> opt = Optional.ofNullable(b.getGrilFriend());
// 如果有女朋友就返回他的女朋友,否则只能欣赏“嫦娥”了
Girl girl = opt.orElse(new Girl("嫦娥"));
System.out.println("他的女朋友是:" + girl.getName());
}
@Test
public void test3(){
Optional<Employee> opt = Optional.of(new Employee("张三", 8888));
//判断opt中员工对象是否满足条件,如果满足就保留,否则返回空
Optional<Employee> emp = opt.filter(e -> e.getSalary()>10000);
System.out.println(emp);
}
@Test
public void test4(){
Optional<Employee> opt = Optional.of(new Employee("张三", 8888));
//如果opt中员工对象不为空,就涨薪10%
Optional<Employee> emp = opt.map(e -> 
{e.setSalary(e.getSalary()%1.1);return e;});
System.out.println(emp);
}

了解 Fork/Join 框架

Fork/Join 框架:就是在必要的情况下,

将一个大任务,进行拆分(fork)成若干个 小任务(拆到不可再拆时),

再将一个个的小任务运算的结果进行 join 汇总.
在这里插入图片描述

Fork/Join 框架与传统线程池的区别

采用 “工作窃取”模式(work-stealing): 当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线 程队列中,

然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。

相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.

在一般的线程池中,如果一个线程正在执行的任务由于某些原因 无法继续运行,

那么该线程会处于等待状态.而在fork/join框架实现中,

如果某个子线程问题由于等待另外一个子线程问题的完成而无法继续运行.

那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程 的等待时间,提高了性能.

新时间日期API

使用LocalDate、LocalTime、LocalDateTime

⚫ LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,

分别表示使用 ISO-8601日 历系统的日期、时间、日期和时间。

它们提供 了简单的日期或时间,并不包含当前的时间信 息。也不包含与时区相关的信息。 注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
在这里插入图片描述

Instant 时间戳

⚫ 用于“时间戳”的运算。

它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始

所经历的描述进行运算

Duration 和 Period

⚫ Duration:用于计算两个“时间”间隔

⚫ Period:用于计算两个“日期”间隔

日期的操纵

⚫ TemporalAdjuster : 时间校正器。有时我们可能需要获 取

例如:将日期调整到“下个周日”等操作。

⚫ TemporalAdjusters: 该类通过静态方法提供了大量的常 用 TemporalAdjuster 的实现。

例如获取下个周日:

在这里插入图片描述

解析与格式化

java.time.format.DateTimeFormatter类:该类提供了三种 格式化方法:

  1. 预定义的标准格式 2. 语言环境相关的格式 3. 自定义的格式

时区的处理

Java8 中加入了对时区的支持,

带时区的时间为分别为: ZonedDate、ZonedTime、ZonedDateTime

其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式

例如 :Asia/Shanghai 等 ZoneId:该类中包含了所有的时区信息 getAvailableZoneIds() :

可以获取所有时区时区信息 of(id) : 用指定的时区信息获取ZoneId 对象

与传统日期处理的转换

在这里插入图片描述

接口中的默认方法与静态方法

Java 8中允许接口中包含具有具体实现的方法,该方法称为 “默认方法” ,

默认方法使用 default 关键字修饰。

例如:

在这里插入图片描述

接口默认方法的”类优先”原则

若一个接口中定义了一个默认方法,而另外一个父类或接口中 又定义了一个同名的方法时

  • 选择父类中的方法。如果一个父类提供了具体的实现,那么 接口中具有相同名称和参数的默认方法会被忽略。
  • 接口冲突。如果一个父接口提供一个默认方法,而另一个接 口也提供了一个具有相同名称和参数列表的方法(不管方法 是否是默认方法),那么必须覆盖该方法来解决冲突
    在这里插入图片描述

接口中的静态方法

Java8 中,接口中允许添加静态方法。

例如:

在这里插入图片描述

重复注解与类型注解

Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解

在这里插入图片描述

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

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

相关文章

六、Docker容器数据卷

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、容器数据卷1.1 容器数据卷1.2 怎么用1.3 能干什么 二、实践案例2.1 启动ubuntu容器实例&#xff0c;挂载目录&#xff1a;2.2 在ubuntu容器实例的/tmp/docker_data中…

Android 组件化架构思路

作者&#xff1a;往事一块六毛八 为什么要模块化/组件化 随着APP版本不断的迭代&#xff0c;新功能的不断增加&#xff0c;业务也会变的越来越复杂&#xff0c;APP业务模块的数量有可能还会继续增加&#xff0c;而且每个模块的代码也变的越来越多&#xff0c;这样发展下去单一…

GNS3报错“unable to open TAP device tap0 (No such file or directory)”解决

系统&#xff1a;MacOS 13.4 GNS3版本&#xff1a;2.2.35.1 Tunnelblick&#xff1a;3.8.8b 起因 在gns3中使用cloud节点创建 tap 接口连接路由器报错&#xff1a; 解决办法 借助 Tunnelblick工具创建 Tap 虚拟网卡。Tunnelblick下载地址&#xff1a; https://tunnelblic…

Kubernetes入门实战课-初始容器

Kubernetes入门实战课-初始容器 文章目录 Kubernetes入门实战课-初始容器课前准备初始容器Docker 的形态Docker 的安装Docker 的架构 容器的本质隔离原因与虚拟机区别隔离是怎么实现的 镜像创建容器镜像&#xff1a;如何编写正确、高效的Dockerfile镜像的内部机制是什么Dockerf…

MySQL数据库连接查询和存储过程

MySQL数据库连接查询和存储过程 一、连接查询1、内连查询2、左连接3、右链接 二、存储过程1、存储过程简介2、存储过程的优点3、语法3.1 参数分类3.2 不加参数的存储过程3.3 带参数的存储过程3.4删除存储过程3.5 事务和存储过程有什么区别&#xff1f; 三、总结1、连接查询2、存…

【Java项目中 利用Redis实现数据缓存】

文章目录 Java SpringBoot项目中 用Redis实现数据缓存1 环境搭建1.1 maven坐标1.2 配置文件1.3 配置类 2 实现缓存短信验证码3 缓存菜品数据4 Spring Cache 缓存框架4.1 Spring Cache介绍4.2 Spring Cache常用注解4.3 Spring Cache使用方式 Java SpringBoot项目中 用Redis实现数…

一文了解Moonbeam互连合约

什么是互连合约Connected Contracts 简单来说&#xff0c;互连合约是通过Moonbeam连接其他区块链上的一个或多个智能合约&#xff0c;其允许目标链上的用户通过跨链消息传递协议在一个应用中操作不同链上的资产或是服务。 通过互连合约方案&#xff0c;不同迥异的公链技术架构…

计算机内部总线详解

文章目录 总线概述地址总线位宽 数据总线位宽CPU性能指标 例题 总线概述 众所周知&#xff0c;总线就是用来帮助连接两个或多个计算机组件&#xff0c;用于数据传输&#xff0c;计算机内部存在三种类型的总线&#xff1a; 地址总线&#xff1a;用于传输指示计算机中的内存或外…

【uboot1】常用指令

文章目录 1.U-Boot命令之常用命令&#xff1a;7.U-Boot命令之EMMC和SD卡操作命令&#xff1a;一般EMMC和SD卡是同一个东西&#xff0c;没特殊说明&#xff0c;统一MMC来代指EMMC和SD卡8.U-Boot命令之内存操作命令&#xff1a;直接对DRAM进行读写操作&#xff0c;uboot命令中的数…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…

强化学习从基础到进阶-案例与实践[5]:梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

解决关于msvcp120.dll丢失的问题(解决方法)

msvcp120.dll是微软软件包的一部分。它是一个库文件&#xff0c;可用于支持软件运行时&#xff0c;msvcp120.dll的作用是提供计算机程序所需的标准库&#xff0c;msvcp120.dll还负责管理堆内存、线程和异常处理函数等。在使用windows编写的应用程序中&#xff0c;通常需要使用此…

【新星计划·2023】Linux系统的架构和组件讲解

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Linux系统的架构和组件。 目录 一、Linux系统的架构 1、硬件层 2、内核层 3、进程管理子系统 4、内存管理子系统 5、…

JDBC和数据库应用总结

文章目录 1. JDBC介绍2. 相关jar包引入3. JDBC与数据库基本连接4. JDBC API 详解4.1 Connection 接口4.2 Statement 接口4.3 ResultSet 5. PreparedStatement 详解 1. JDBC介绍 JDBC是一套标准接口&#xff0c;这套接口用于操作所有的数据库&#xff0c;不同的数据库厂商对迎合…

在C#下运行Python:IronPython和Pythonnet

在C#下运行Python可能有不同的原因。其中一些原因包括&#xff1a; 使用C#应用程序中不可用的特定Python功能或库。结合Python的简单性和表现力以及C#的性能和稳健性&#xff0c;完成不同任务。与基于Python的系统或服务进行集成。 为实现Python和C#之间的互操作性&#xff0…

Java日志框架介绍

​今天来聊一聊 Java 日志框架&#xff0c;不管是在项目开发阶段的调试&#xff0c;还是项目上线后的运行&#xff0c;都离不开日志。日志具有处理历史数据、定位程序问题、理解程序运行过程等重要作用。在 Spring 项目开发过程中我们常见的日志框架可能就是 logback、log4j2 和…

Go学习圣经:Go语言实现高并发CRUD业务开发

说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#…

APP/小程序嵌入游戏,游戏飞跃的赛道

APP/小程序接入游戏运营已不是新鲜事&#xff0c;然而&#xff0c;其仍具有巨大的发展潜力&#xff0c;尤其是社交类APP&#xff0c;多以加入娱乐游戏增加互动&#xff0c;获取目标客户&#xff0c;同时为产品增加变现渠道&#xff0c;实现双赢。 对于APP嵌入式游戏&#xff0…

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 一、微服务介绍1、系统架构演变1&#xff09;单体应用架构2&#xff09;垂直应用架构3&#xff09;分布式4&#xff09;SOA架构5&#xff09;微服务框架6&#xff09;常见微服务架构 2、SpringCloud Alibaba介绍3、S…

【C语言督学训练营 第十四天】二叉树真题实战 ----- 层序建树、前中后序遍历、求树的WPL

文章目录 前言树概念二叉树层序建树四种遍历二叉树的方式层次遍历前序遍历中序遍历后续遍历 真题实战&#xff01; 前言 今天进行总结的是考研408有关二叉树的基础知识&#xff0c;是王道C语言督学营的第十四天&#xff0c;随着课程的深入&#xff0c;代码实战的难度慢慢的上来…