您现在的位置是:首页 > 正文

【JDK8 新特性 8】JDK 8新增的Optional类&新的日期和时间 API & 重复注解与类型注解

2024-01-30 20:38:51阅读 0

上一篇文章:【JDK8 新特性 7】并行的Stream流&parallelStream背后的技术_一切总会归于平淡的博客-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 存在的问题

  1. 设计很差: 在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期。此外用于格式化和解析的类在java.text包中定义。
  2. 非线程安全:java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
  3. 时区处理麻烦:日期类并不提供国际化,没有时区支持,因此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方法会创建对象的一个副本,并按照需要修改它的属性。

以下所有的方法都返回了一个修改属性的对象,他们不会影响原来的对象。

对日期时间的修改

 // 获取当前日期时间
        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 类可以进行日期时间解析与格式化。

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 中加入了对时区的支持,LocalDateLocalTimeLocalDateTime是不带时区的,带时区的日期时间类分别为:ZonedDateZonedTimeZonedDateTime

其中每个时区都对应着 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 的使用

测试

网站文章

  • netbeans部署工程至外部tomcat

    netbeans部署工程至外部tomcat

    1.在启动端口中不使用8080修改为其他端口,因为这个端口已被其他服务器占用(如:glassfish等),否则部署不成功,并不显示具体错误. 这个问题困扰我很久,终于被发现 2.使用tomcat的zip版,也就是绿色版. 3.路径中不出现中文. 4.有可能要配置(catalina_home,catalina_base)...

    2024-01-30 20:38:34
  • vue项目使用crypto-js在IE中报错SCRIPT1006: 缺少 ‘)‘

    1.版本问题,crypto-js 4.0.0版本以上会出现问题 2.如果4.0.0的版本还是报错,那就把node_models中把crypto-js中的crypto-js.js文件复制出来直接引用,不...

    2024-01-30 20:38:06
  • L1正则能够得到稀疏解

    L1正则能够得到稀疏解

    在复习到过拟合的解决方法的时候L1正则化和L2正则化都可以用于降低过拟合的风险,但是L1正则化还会带来一个额外的好处:它比L2正则化更容易获得稀疏解,也就是说它求得的w权重向量具有更少的非零分量。主要...

    2024-01-30 20:38:00
  • appium 多开

    最近跑一个app 使用的是appium,单开太慢了~,就想多开,结果遇到一个问题,最后解决了,这里记录一下! self.desired_caps = { "platformName": PLATFROM, "deviceName": DEVIE_NAME, "udid":UDID, ...

    2024-01-30 20:37:53
  • OpenKruise v1.1:功能增强与上游对齐,大规模场景性能优化

    OpenKruise v1.1:功能增强与上游对齐,大规模场景性能优化

    简介:在 v1.1 版本中,OpenKruise 对不少已有功能做了扩展与增强,并且优化了在大规模集群中的运行性能。以下对 v1.1 的部分功能做简要介绍。作者:酒祝(王思宇)云原生应用自动化管理套件...

    2024-01-30 20:37:23
  • //众神云集、群魔乱舞、以一抵百、砥砺前行//P1182 数列分段 Section II

    题目描述题目链接题解使用二分答案。二分的对象是数段的和,二分的范围是1-1e10。代码如下:#include<algorithm>#include<iostream>#include<cstdio>#...

    2024-01-30 20:37:18
  • SVN项目检出报错 :/gen already exists but is not a source folder. Convert to a source folder or rename it

    SVN导出后项目报错 /gen already exists but is not a source folder. Convert to a source folder or rename it 这个错误一般是由对函数库的改动或是路径的重置引起的,显示为 /myProject/gen already exists but is not a source folder. Convert t

    2024-01-30 20:37:11
  • JS获取对象的长度

    JS获取对象的长度

    2024-01-30 20:37:05
  • windows10系统下基于pybind11库进行c++代码调用python(pytorch)代码

    windows10系统下基于pybind11库进行c++代码调用python(pytorch)代码

    c++应用程序exe调用pytorch模型训练数据

    2024-01-30 20:36:36
  • 以字节流形式读取文件和写入数据

    1.InputStream和OutStream都是字节流。 2.以字节流形式写入文件。 package file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class TestFile { public static void main(Strin...

    2024-01-30 20:36:29