首页 > 编程语言 >Java中JDK8-17新特性的学习上

Java中JDK8-17新特性的学习上

时间:2024-10-17 19:00:29浏览次数:7  
标签:Java 17 System 获取 JDK8 时间 LocalDateTime println Optional

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 实现函数式编程的强劲一步,并且帮助在范式中实现。

  1. empty()

返回一个 Optional容器对象,而不是 null。建议常用

  1. of(T value)

创建一个 Optional对象,如果 value 是 null,则抛出 NPE。不建议用

  1. ofNullable(T value)

同上,创建一个 Optional对象,但 value 为空时返回 Optional.empty()。推荐使用

  1. get()

返回 Optional中包装的值,在判空之前,千万不要直接使用!尽量别用!

  1. orElse(T other)

同样是返回 Optional中包装的值,但不同的是当取不到值时,返回你指定的 default。看似很好,但不建议用

  1. orElseGet(Supplier<? extends T> other)

同样是返回 Optional中包装的值,取不到值时,返回你指定的 default。看似和 5 一样,但推荐使用

  1. orElseThrow(Supplier<? extends X> exceptionSupplier)

返回 Optional中包装的值,取不到值时抛出指定的异常。阻塞性业务场景推荐使用

  1. isPresent()

判断 Optional中是否有值,返回 boolean,某些情况下很有用,但尽量不要用在 if 判断体中。

  1. 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

相关文章

  • 10.17
    深入学习了文件上传功能。通过使用Servlet实现文件的上传.importjavax.servlet.ServletException;importjavax.servlet.annotation.MultipartConfig;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpS......
  • JavaScript从零学起 —— 数据类型(进阶篇2)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言一、Boolean(布尔值)1.定义2.实现3.用法示例4.常见问题与解决方法二、Undefined(未定义)1.定义2.实现3.常见问题与解决方法三、Null(空值)1.定义2.实现3.用法示例4.常见问题与......
  • JavaScript网页设计案例
    1.引言在前端开发中,JavaScript无疑是一个非常重要的语言。它不仅可以用于表单验证、动态内容更新,还能实现复杂的交互效果和动画。通过JavaScript,网页变得更加生动和富有互动性。本文将通过一个具体的网页设计案例,详细讲解如何使用JavaScript进行网页开发,包括准备工作、基础理......
  • 归并排序(Java)
    思想:基本思想是使用递归将数组不断分成两半,直到分成的小组都只剩下一个元素为止,随后分别开始排序,将排序好的数组合并在一起。归并排序使用了分治(DivideandConquer)的思想。包括以下三个步骤:划分(Divide):将原问题分解成几个规模较小的相同问题。解决(Conquer):递归求解这些子问......
  • LeetCode:809.情感丰富的文字(双指针 Java)
    目录809.情感丰富的文字题目描述:实现代码与解析:双指针原理思路:809.情感丰富的文字题目描述:        有时候人们会用重复写一些字母来表示额外的感受,比如 "hello"->"heeellooo", "hi"->"hiii"。我们将相邻字母都相同的一串字符定义为相同字母组,例如:"h",......
  • Day17什么是方法
    Day17什么是方法何谓方法?System.out.println(),那么它是什么呢?答:System是类;out是指System输出的对象,println()是方法___()是方法Java方法是语句的集合:它们在一起执行一个功能。1.方法是解决一类问题的步骤的有序组合2.方法包含于类或对象中3.方法在程序......
  • Java基于微信小程序的大学生兼职管理系统,附源码+文档
    博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 10.17 模拟赛
    炼石计划10月01日NOIP模拟赛#7【补题】-比赛-梦熊联盟(mna.wang)复盘T1一眼不会。先打了前\(30\)的爆搜。虽然这个爆搜假了但是最后也没管它。后面的暴力分挺多。先往后做。T2\(2^{2n}\)的暴力可以过\(20\)。\(n=16\)的特殊性质可以\(3^n\)枚举子集过。......
  • 17.Python基础篇-闭包、装饰器、迭代器、生成器
    函数的进阶—闭包闭包的定义:嵌套函数,内部函数调用外部函数的变量。满足这个条件就算闭包。闭包案例演示:defouter():a=1definner():print('inner函数中打印的变量a:',a)#嵌套函数中使用了外层函数的变量。此时满足了闭包的条件。returninner......
  • Java多线程编程:深入理解与实践
    java笔记,点击下载在现代软件开发中,多线程编程已成为提高程序性能和响应能力的关键技术之一。Java作为一门高级编程语言,提供了丰富的多线程支持,使得开发者能够轻松地编写并发程序。本文将深入探讨Java多线程的基本概念、实现方式以及最佳实践。多线程的基本概念多线程是指......