jdk8新特性-接口和日期处理

简介: jdk8新特性-接口和日期处理

一、java新特性玩转JDK8之default关键字

首先创建一个java基础的项目

①、在jdk1.8以前接口里面是只能有抽象 方法,不能有任何方法的实现的,默认是public修饰的。

  1. package com.weizhaoyang;

  2. public interface Animal {
  3.    void run();
  4.    void eat();
  5. }

②、jdk1.8里面打破了这个规定,引入了新的关键字default,使用default修饰的方法,可以在接口里面定义具体的方法实现

③、默认方法:

接口里面定义一个默认的方法,这个接口的实现类实现了这个接口之后,不管这个default修饰的方法就可以直接调用,即接口方法的默认实现

代码如下:

  1. package com.weizhaoyang;

  2. public interface Animal {
  3.    void run();
  4.    void eat();
  5.    default void breath(){
  6.        System.out.println("使用氧气呼吸");
  7.    }
  8. }
  9. package com.weizhaoyang;

  10. public class Dog implements  Animal {
  11.    @Override
  12.    public void run() {
  13.        System.out.println("跑步");

  14.    }

  15.    @Override
  16.    public void eat() {
  17.        System.out.println("吃");
  18.    }
  19. }
  20. package com.weizhaoyang;

  21. public class Main {
  22.    public static void main(String[] args) {
  23.        Dog  dog=new Dog();
  24.        dog.breath();
  25.        dog.eat();
  26.        dog.run();
  27.    }
  28. }

运行的结果如下:




④、静态方法:接口名 .静态方法来访问接口中的的静态方法

  1. package com.weizhaoyang;

  2. public interface Animal {
  3.    void run();
  4.    void eat();
  5.    default void breath(){
  6.        System.out.println("使用氧气呼吸");
  7.    }
  8.    static void  test(){
  9.        System.out.println("这是个静态方法");
  10.    }
  11. }
  12. package com.weizhaoyang;

  13. public class Main {
  14.    public static void main(String[] args) {
  15.        Dog  dog=new Dog();
  16.        dog.breath();
  17.        dog.eat();
  18.        dog.run();
  19.        Animal.test();
  20.    }
  21. }

运行的结果如下:

使用场景:接口里面定义公用的业务逻辑,抽取出来,每个子类都是必须具备的

二、java新特性玩转JDK8之base64加解密API

①、什么是Base64编码

Base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法

②、基于64个字符A-Z,a-z,0-9,+,/的编码方式,是一种能将任意二进制数据用64种字元组合成字符串的方法,而这个二进制数据和字符串之间是可以相互转换的,在实际应用 上,Base64除了能将二进制数据可视化之外,也常用来表示字符串加密过后的内容

比如:图片可以用字符串也可以用二进制来存储,中小型的网站是用密码的解密也可以用Base64。

早期的java要使用Base64怎么做?

使用JDK里sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类

代码如下:

  1. package com.weizhaoyang;

  2. import sun.misc.BASE64Decoder;
  3. import sun.misc.BASE64Encoder;

  4. import java.io.IOException;

  5. public class Main {
  6.    public static void main(String[] args) throws IOException {
  7.        BASE64Encoder  encoder =new BASE64Encoder();
  8.        BASE64Decoder decoder=new BASE64Decoder();
  9.        String  text="weizhaoyang";
  10.        byte[] textBytes = text.getBytes("UTF-8");
  11.        String encode = encoder.encode(textBytes);
  12.        System.out.println(encode);
  13.        System.out.println(new String(decoder.decodeBuffer(encode), "UTF-8"));
  14.    }
  15. }

运行的结果如下 :

缺点:编码和解码的效率比较差,需要做转换 公开信息说以后的版本会取消这个方法

③、Apache Commons Codec有提供Base64的编码和解码。缺点:是需要引用Apache Commons Codec

④、jdk1.8之后怎么玩?(首选推荐)  A:jdk1.8的java.util包中,新增了Base64的类

好处:不用引包,编解码效率远大于sun.misc和apache Commons  Codec

代码如下:

  1.       Base64.Encoder  encoder=Base64.getEncoder();
  2.        Base64.Decoder  decoder=Base64.getDecoder();
  3.        String  text="weizhaoyang";
  4.        byte[] textBytes = text.getBytes("UTF-8");
  5.        //编码
  6.        String  encodeText= encoder.encodeToString(textBytes);
  7.        System.out.println(encodeText);
  8.        //解码
  9.        String s = new String(decoder.decode(encodeText), "UTF-8");
  10.        System.out.println(s);

运行结果如下:

三、java新特性玩转JDK8之时间日期处理类上篇

①、时间处理再熟悉不过,SimplaDateFormat,Calendar,Date等类

旧版特点:  java.util.Date是非线程安全的   API设计比较差,日期/时间对象比较,加减麻烦

②、java8通过发布新的Date-Time API(jsr 310) 来进一步加强对日期与时间的处理

新增了很多常见的api,如 日期/时间的比较,加减,格式化等

包所在的位置 java.time

核心类

   LocalDate :不包含具体时间的日期:当地的日期

   LocalTime:不包含日期的时间

   LocalDateTime:包含了日期及时间。

LocalDate 常用API,代码如下:

  1. package com.weizhaoyang;


  2. import java.io.IOException;
  3. import java.time.LocalDate;

  4. public class Main {
  5.    public static void main(String[] args) throws IOException {
  6.        LocalDate   date=LocalDate.now();
  7.        System.out.println("今天日期"+date);
  8.        //获取年月日,周几
  9.        System.out.println("现在是哪年"+date.getYear());
  10.        System.out.println("现在是哪月"+date.getMonth());
  11.        System.out.println("现在是哪月(数字)"+date.getMonthValue());
  12.        System.out.println("现在是几号"+date.getDayOfMonth());
  13.        System.out.println("现在是周几"+date.getDayOfWeek());
  14.        //加减年份,加后返回的对象才是修改过的,旧的依然是旧的
  15.        LocalDate date1 = date.plusYears(1);
  16.        System.out.println("加后是哪年"+date1.getYear());
  17.        System.out.println("旧的是哪年"+date.getYear());
  18.        //日期比较:true
  19.        System.out.println("isAfter:"+date1.isAfter(date));
  20.    }
  21. }

运行的结果如下:

java新特性玩转JDK8之时间日期处理类下篇

日期时间格式化

     jdk8之前:SimpleDateFormat来进行格式化,但SimpleDateFormat并不是线程安全的

     jdk8之后,引入线程安全的日期和时间DateTimeFormatter

代码如下:

  1. package com.weizhaoyang;


  2. import java.io.IOException;
  3. import java.time.LocalDateTime;
  4. import java.time.format.DateTimeFormatter;

  5. public class Main {
  6.    public static void main(String[] args) throws IOException {
  7.        LocalDateTime  ldt=LocalDateTime.now();
  8.        System.out.println(ldt);
  9.        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  10.        System.out.println(formatter.format(ldt));
  11.    }
  12. }

运行的结果如下:

获取指定的日期时间对象

代码如下:

  1. package com.weizhaoyang;


  2. import java.io.IOException;
  3. import java.time.LocalDateTime;

  4. public class Main {
  5.    public static void main(String[] args) throws IOException {
  6.        LocalDateTime ldt = LocalDateTime.of(2020,11,11,8,20,30);
  7.        System.out.println(ldt);
  8.    }
  9. }

运行的结果如下:

计算时间日期差java.time.Duration

代码如下:

  1. package com.weizhaoyang;


  2. import java.io.IOException;
  3. import java.time.Duration;
  4. import java.time.LocalDateTime;

  5. public class Main {
  6.    public static void main(String[] args) throws IOException {
  7.        //LocalDateTime ldt = LocalDateTime.of(2020,11,11,8,20,30);
  8.        //System.out.println(ldt);
  9.        LocalDateTime today=LocalDateTime.now();
  10.        System.out.println(today);
  11.        LocalDateTime ldt1 = LocalDateTime.of(2020,11,11,8,20,30);
  12.        System.out.println(ldt1);
  13.        Duration between = Duration.between(today, ldt1);
  14.        //相差多些天
  15.        System.out.println(between.toDays());
  16.        //相差多少小时
  17.        System.out.println(between.toHours());
  18.        //相差的毫秒数
  19.        System.out.println(between.toMillis());
  20.        //相差纳秒数
  21.        System.out.println(between.toNanos());
  22.    }
  23. }

运行的结果如下:

java新特性玩转JDK8之Optional类

①、Optional类有啥用
   主要解决的问题是空指针异常(NullPointException)

   怎么解决?

        本质上是一个包含有可选值的包装类,这意味着Optional类既可以包含对象也可以为空

②、创建Optional类

   of()

       null值作为参数传递进去,则会抛异常

ofNullable()

     如果对象即可能是null也可能是非null,应该使用ofNullable方法

访问Optional对象的值

   get()方法

代码如下:

  1. package com.weizhaoyang;


  2. import java.io.IOException;
  3. import java.util.Optional;

  4. public class Main {
  5.    public static void main(String[] args) throws IOException {
  6.        Student student=null;
  7.        Optional<Student> optional=Optional.ofNullable(student);
  8.        Student  s=optional.get();
  9.    }
  10. }

运行结果如下:因为对象为空,所以get方法的时候报错:

关于jdk8的一些新特性,下回讲解。      

相关文章
|
8天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2465 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
4天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1505 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19274 29
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18822 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17515 13
Apache Paimon V0.9最新进展
|
6天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
375 11
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18698 16
|
3天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
3天前
|
SQL 监控 druid
Druid连接池学习
Druid学习笔记,使用Druid进行密码加密。参考文档:https://github.com/alibaba/druid
197 82