JDK8-17新特性(第一部分)
目录
Lambda表达式
Lambda表达式是JDK1.8之后的一种语法,是一个匿名函数,是对匿名函数的简写形式,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升;
Lambda语法
JDK1.8之后引入的一种语法,他的写法是使用一个->
符号,箭头将Lambda表达式分为左右两部分,左边写的是实现的这个接口中的抽象方法中的形参列表,右边就是对抽象方法的处理;
实现的这个接口中的抽象方法中的形参列表 -> 抽象方法的处理
MyInterface myInterface1 = (int a, int b) -> {
System.out.println(a + b);
};
MyInterface1 test2 = (int a, int b) -> {
return a - b;
};
新的时间/日期API的使用
我们一直以来在写代码使用的时间无外乎两种,Date和Calender。
但是传统的时间 API 存在线程安全的问题,在多线程开发中必须要上锁,所以 java8 现在为我们提供了一套全新的时间日期 API ,今天进来学习一下java8 的时间日期 API。
LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 (ISO-8601 日历系统是国际化组织制定的现代化公民的日期和时间的表达法)日历系统的日期、时间、日期和时间。从名称也可以看出来,第一种表示日期 年月日,第二种表示时间 时分秒,第三种表示年月日时分秒。
由于的实例是不可变的对象,所以我们如果对时间对象进行更改,包括修改时间,加减时间都需要重新返回一个新的实例。
/**
* 测试 LocalDate,LocalTime,LocalDateTime
*/
@Test
public void testLocalDate(){
//获取当前日期
LocalDate localDate = LocalDate.now();
//获取当前日期
LocalTime localTime = LocalTime.now();
//获取当前日期时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDate:"+localDate+" localTime:"+localTime+" localDateTime:"+localDateTime);
}
常用方法
使用LocalDateTime.of()可以获取指定时间
对日期时间进行加操作,使用 localDateTime.plusXXX(num)
对日期时间进行减操作,使用 localDateTime.minusXXX(num)
修改不限于,年、月、日、时、分、秒、纳秒
LocalDateTime localDateTime1 = localDateTime.plusYears(2);
System.out.println("指定时间添加2年:"+localDateTime1);
LocalDateTime localDateTime2 = localDateTime.plusMonths(2);
System.out.println("指定时间添加2月:"+localDateTime2);
LocalDateTime localDateTime3 = localDateTime.minusDays(2);
System.out.println("指定时间减少2天:"+localDateTime3);
Instant时间戳(以Unix 元年 : 1970-01-01 00:00:00 到某个时间之间的毫秒数)
/**
* 获取时间戳(UTC)时间
*/
@Test
public void testInstant(){
//获取当前时间戳 时间戳已UTC 时间展示,与中国时间差距8小时
Instant instant = Instant.now();
System.out.println("UTC instant:"+instant);
//如果想要获取中国时间 可以通过设置偏移量来获取
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println("中国时间 offsetDateTime:"+offsetDateTime);
}
我们以前来获取当前时间戳是用:new Date().getTime()
以及 System.currentTimeMillis
获取。
现在可用使用instant.toEpochMilli()
来获取,他们三个获取的时间戳是一样的。
//toEpochMilli 获取毫秒数
long l = instant.toEpochMilli();
System.out.println("使用instant获取当前时间戳:"+l);
System.out.println("使用new Date()获取当前时间戳"+new Date().getTime());
System.out.println("使用System.currentTimeMillis获取当前时间戳:"+System.currentTimeMillis());
Duration获取连个时间之间的间隔(LocalDateTime、Instant)
使用Duration.between(instant, instant1)获取两个时间时间差返回一个 Duration对象,可以通过对象内部的实例方法获取时间间隔。
要注意的是:这里获取秒与纳秒的方式有点特别:
获取毫秒间隔包括天数、小时、分钟与获取秒的方法前缀是不一样的。一个是toXXX()
一个是getXXX();
//使用Duration 获取两个时间时间差
@Test
public void testDuration() throws InterruptedException {
Instant instant = Instant.now();
Thread.sleep(4899);
Instant instant1 = Instant.now();
Duration between = Duration.between(instant, instant1);
System.out.println("毫秒:"+between.toMillis());
System.out.println("秒:"+between.getSeconds());
}
时间矫正器
TemporalAdjuster:时间矫正器。有时我们可能需要获取一个周末,或者下一个工作日等时间,这里 java8 就为我们提供了一个时间校正器,让我们对时间进行校准。
TemporalAdjusters:该类通过静态方法提供了大量的常用的TemporalAdjuster的实现供我们使用。
在localDateTime中,有一个with方法,其中可以让我们去写一TemporalAdjuster接口,而TemporalAdjusters类中,有许多常用的方法
时间格式化工具 DateTimeFormatter
DateTimeFormatter是专门为LocalDateTime进行格式化的工具类,内置了很多基本格式,也可自定义时间格式化公式。
写法也比较特别,可以是formatter.format(dateTime),也可以是dateTime.format(formatter)
LocalDateTime 与 Date 互转
LocalDateTime 与 Date 互转主要是利用两者共有的属性Instant进行相互转换。
- LocalDateTime --> Date:LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); 或者 date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
- Date–> LocalDateTime :Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
optional类的使用
Optional类是Java8新引进的一个主要用于解决的问题是臭名昭著的空指针异常(NullPointerException|)的一个类。
本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。
- empty()
返回一个 Optional
容器对象,而不是 null。建议常用
- of(T value)
创建一个 Optional
对象,如果 value 是 null,则抛出 NPE。不建议用
- ofNullable(T value)
同上,创建一个 Optional
对象,但 value 为空时返回 Optional.empty()
。推荐使用
- get()
返回 Optional
中包装的值,在判空之前,千万不要直接使用!尽量别用!
- orElse(T other)
同样是返回 Optional
中包装的值,但不同的是当取不到值时,返回你指定的 default。看似很好,但不建议用
- orElseGet(Supplier<? extends T> other)
同样是返回 Optional
中包装的值,取不到值时,返回你指定的 default。看似和 5 一样,但推荐使用
- orElseThrow(Supplier<? extends X> exceptionSupplier)
返回 Optional
中包装的值,取不到值时抛出指定的异常。阻塞性业务场景推荐使用
- isPresent()
判断 Optional
中是否有值,返回 boolean,某些情况下很有用,但尽量不要用在 if 判断体中。
- ifPresent(Consumer<? super T> consumer)
判断 Optional
中是否有值,有值则执行 consumer,否则什么都不干。
接口增强
允许接口使用 default
关键字
在java8中接口中的函数可以使用default
关键字修饰接口,进行默认实现,使接口更加的灵活。可以在接口中写一个通用默认的实现,减少实现类实现代码。如果默认的实现方法不能满足需求,也可以重写此实现。
允许接口定义静态方法
在Java8中接口里可以声明静态方法,并且可以实现。
标签:Java,17,System,获取,JDK8,时间,LocalDateTime,println,Optional From: https://www.cnblogs.com/BingBing-8888/p/18472891