上一篇文章:【JDK8 新特性 7】并行的Stream流¶llelStream背后的技术_一切总会归于平淡的博客-CSDN博客
目录
1、Optional类
1.1 Optional的基本使用
1、Optional类的创建方式
2、Optional类的常用方法
3、Optional类的使用
2、JDK 8新的日期和时间 API
2.1 JDK 8的日期和时间类【代码示例】
2.2 JDK 8的时间格式化与解析
2.3 JDK 8的 Instant 类
2.4 JDK 8的计算日期时间差类
2.5 JDK 8的时间校正器
2.6 JDK 8设置日期时间的时区
3、JDK 8重复注解与类型注解
4、类型注解的使用
首先我们来看看以前我们对NULL 的处理。
不知道有多少人是像我这样的。
接下来给大家介绍Optional类。
1、Optional类
Optional是一个没有子类的工具类,Optional是一个可以为null的容器对象。它的作用主要就是为了解决避免Null检查,防止NullPointerException( 空指针异常)。
1.1 Optional的基本使用
1、Optional类的创建方式
1 .创建一个 Optional 实例 : Optional.of(T t)
2.创建一个空的 Optional 实例 : Optional.empty() & Optional.ofNullable(T t);
3.若 t 不为 null,创建 Optional 实例,否则创建空实例:Optional.ofNullable(T t)
2、Optional类的常用方法
方法 | 说明 |
---|---|
isPresent() | 判断是否包含值,包含值返回true,不包含值返回false |
get() | 如果Optional有值则将其返回,否则抛出NoSuchElementException |
orElse(T t) | 如果调用对象包含值,返回该值,否则返回参数t |
orElseGet(Supplier s) | 如果调用对象包含值,返回该值,否则返回 s 获取的值 |
map(Function f) | 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty() |
3、Optional类的使用
isPresent() get()
orElse(T t)
orElseGet(Supplier s)
ifPresent(Consumer<? super T> consumer)
map(Function f)
不知道这样的判空方式如何?
2、JDK 8新的日期和时间 API
在学习JDK8新的日期和时间API之前,我们要知道旧版日期时间API存在的问题。
旧版日期时间 API 存在的问题
- 设计很差: 在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期。此外用于格式化和解析的类在java.text包中定义。
- 非线程安全:java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
- 时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
新日期时间 API介绍
JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包中,下面是一些关键类。
方法 | 说明 |
---|---|
LocalDate | 表示日期,包含年月日,格式为 2022-06-07 |
LocalTime | 表示时间,包含时分秒,格式为 16:38:54.158549300 |
LocalDateTime | 表示日期时间,包含年月日,时分秒,格式为 2022-06-07T15:33:56.750 |
DateTimeFormatter | 日期时间格式化类 |
Instant | 时间戳,表示一个特定的时间瞬间。 |
Duration | 用于计算2个时间(LocalTime,时分秒)的距离 |
Period | 用于计算2个日期(LocalDate,年月日)的距离 |
ZonedDateTime | 包含时区的时间 |
Java中使用的历法是ISO 8601日历系统,它是世界民用历法,也就是我们所说的公历。平年有365天,闰年是366天。此外Java 8还提供了4套其他历法,分别是:
- ThaiBuddhistDate:泰国佛教历
- MinguoDate:中华日历
- JapaneseDate:日本历
- HijrahDate:伊斯兰历
2.1 JDK 8的日期和时间类【代码示例】
LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 日历系统的日期、时间、日期和时间。
它们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
创建指定日期
得到当前日期
获取日期信息
得到当前时间
得到指定的时间
获取时间信息
获取日期时间
对日期时间的修改,对已存在的LocalDate对象,创建它的修改版,最简单的方式是使用withAttribute方法。
withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。
以下所有的方法都返回了一个修改属性的对象,他们不会影响原来的对象。
代码语言:javascript复制对日期时间的修改
// 获取当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println("now = " now);
// 修改日期时间
LocalDateTime setYear = now.withYear(2078);
System.out.println("修改年份: " setYear);
System.out.println("now == setYear: " (now == setYear));
System.out.println("修改月份: " now.withMonth(9));
System.out.println("修改小时: " now.withHour(9));
System.out.println("修改分钟: " now.withMinute(11));
// 再当前对象的基础上加上或减去指定的时间
LocalDateTime localDateTime = now.plusDays(5);
System.out.println("5天后: " localDateTime);
System.out.println("now == localDateTime: " (now == localDateTime));
System.out.println("10年后: " now.plusYears(10));
System.out.println("20月后: " now.plusMonths(20));
System.out.println("20年前: " now.minusYears(20));
System.out.println("5月前: " now.minusMonths(5));
System.out.println("100天前: " now.minusDays(100));
结果:
日期时间的比较
在JDK8中,LocalDate类中使用isBefore()、isAfter()、equals()方法来比较两个日期,可直接进行比较。
2.2 JDK 8的时间格式化与解析
通过 java.time.format.DateTimeFormatter 类可以进行日期时间解析与格式化。
代码语言:javascript复制public static void main(String[] args) {
// 得到当前日期时间
LocalDateTime now = LocalDateTime.now();
// 格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 将日期时间格式化为字符串
String format = now.format(formatter);
System.out.println("format = " format);
// 将字符串解析为日期时间
LocalDateTime parse = LocalDateTime.parse("1985-09-23 10:12:22", formatter);
System.out.println("parse = " parse);
}
2.3 JDK 8的 Instant 类
Instant 时间戳/时间线,内部保存了从1970年1月1日 00:00:00以来的秒和纳秒。
2.4 JDK 8的计算日期时间差类
Duration/Period类: 计算日期时间差。
方法 | 说明 |
---|---|
Duration | 用于计算2个时间(LocalTime,时分秒)的距离 |
Period | 用于计算2个日期(LocalDate,年月日)的距离 |
2.5 JDK 8的时间校正器
有时我们可能需要获取例如:将日期调整到“下一个月的第一天”等操作。可以通过时间校正器来进行。
方法 | 说明 |
---|---|
TemporalAdjuster | 时间校正器 |
TemporalAdjusters | 该类通过静态方法提供了大量的常用TemporalAdjuster的实现。 |
这是我们自定义的,jdk8中自带了很多时间调整器。例如:
剩下的大家可以自己去使用研究。
2.6 JDK 8设置日期时间的时区
Java8 中加入了对时区的支持,LocalDate、LocalTime、LocalDateTime是不带时区的,带时区的日期时间类分别为:ZonedDate、ZonedTime、ZonedDateTime。
其中每个时区都对应着 ID,ID的格式为 “区域/城市” 。例如 :Asia/Shanghai 等。
ZoneId:该类中包含了所有的时区信息。
3、JDK 8重复注解与类型注解
自从Java 5中引入 注解 以来,注解开始变得非常流行,并在各个框架和项目中被广泛使用。
不过注解有一个很大的限制是:在同一个地方不能多次使用同一个注解。
JDK 8引入了重复注解的概念,允许在同一个地方多次使用同一个注解。
在JDK 8中使用@Repeatable注解定义重复注解。
流程
1、定义重复的注解容器注解
2、 定义一个可以重复的注解
3、配置多个重复的注解
4、解析得到指定注解
4、类型注解的使用
JDK 8为@Target元注解新增了两种类型: TYPE_PARAMETER , TYPE_USE 。
注解 | 说明 |
---|---|
TYPE_PARAMETER | 表示该注解能写在类型参数的声明语句中。 类型参数声明如: <T> 、 |
TYPE_USE | 表示注解可以再任何用到类型的地方使用。 |
1、TYPE_PARAMETER的使用
测试
2、TYPE_USE 的使用
测试