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的一些新特性,下回讲解。      

相关文章
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
44 3
|
1月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
19 0
|
3月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
3月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
2月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
14 0
|
2月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
313 3
|
3月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
57 1
|
3月前
|
Oracle Java 关系型数据库
Mac安装JDK1.8
Mac安装JDK1.8
690 4
|
3天前
|
Ubuntu Java
Ubuntu之jdk安装
以下是Ubuntu之jdk安装的详细内容
10 0