欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional

程序员文章站 2022-06-07 13:11:26
...

Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional

jdk8新特性重点内容

  1. 日期
  2. lambda表达式
  3. 函数式编程
  4. Stream流
  5. 一些其他内容。

jdk8是目前最成功的版本。未来2-3年最常用的版本。

各种系统安装jdk8教程

win10安装jdk8

Linux安装jdk8教程

MAC系统安装jdk8教程

jdk8新特性之default关键字

  1. jdk8之前,接口里面只能有抽象方法,不能有任何方法实现的。
  2. jdk8里面打破了这个规定,引入了新的关键字default,使用default修饰方法,可以在接口里面定义具体的方法实现。接口里面可以定义两种方法实现。默认方法和静态方法。
  3. 默认方法: 接口里面定义一个默认方法,这个接口的实现类实现了这个接口后,不用管这个default修饰的方法,就可以直接调用,即接口方法的默认实现。

接口中写方法也就意味着,不用写该方法的实现方法了,直接在接口的方法体中写了。

public interface Animal {
    void eat();//不写修饰符,表示是public
    void run();
    default void breath(){
        System.out.println("使用氧气呼吸");
    }
}
  1. **静态方法:**可以通过接口名 . 静态方法来访问接口中的静态方法。
public interface Animal {
    void eat();//不写修饰符,表示是public
    void run();
    default void breath(){
        System.out.println("使用氧气呼吸");
    }

    static void test(){
        System.out.println("这个是静态方法");
    }
}

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

Jdk8新特性之新增Base64 API

  1. Base64编码

Base64是网络上最常见的用于传输8Bit字节的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。基于64个字符A-Z,a-z,0-9,+,/的编码方式。是一种能将任意二进制数据用64种子元组合成字符串的方法。这个二进制和字符串资料之间是可以相互转换的。 实际应用中Base64除了能将二进制数据可视化之外,也常用来表示字符串加密后的内容。

  1. 在jdk8之前使用的是sun.misc包进行Base64转换。缺点:编码解码效率非常差。
BASE64Encoder encoder=new BASE64Encoder();
BASE64Decoder decoder=new BASE64Decoder();
String text="李云龙";
byte[] bytes = text.getBytes("UTF-8");
//编码
String encode = encoder.encode(bytes);
System.out.println(encode);
//解码
System.out.println(new String(decoder.decodeBuffer(encode),"UTF-8"));
  1. 使用Apache Commons codec中的包进行转换。但是需要引用第三方包。
  2. jdk8的java.util包中新增了Base64的类,效率远远大于前两者。
Base64.Encoder encoder1=Base64.getEncoder();
Base64.Decoder decoder1=Base64.getDecoder();
String text2="楚云飞";
byte[] bytes2 = text2.getBytes("UTF-8");
String enco = encoder1.encodeToString(bytes2);
System.out.println(enco);
//解码
System.out.println(new String(decoder.decodeBuffer(enco),"UTF-8"));

JDK8新特性之日期处理类

  1. 之前时间处理类有:SimpleDateFormat,Calendar,Date等类。但是缺点是:

java.util.Date是非线程安全的。日期比较相对麻烦,比如,比较两个日期相差几分钟,几天?加减麻烦。

  1. 新增的时间API在java.Time包下。

  2. 核心类:

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

LocalTime:不包含日期的时间。

LocalDateTime:包含了日期和时间。

//getYear()    int    获取当前⽇期的年份
//getMonth()    Month    获取当前⽇期的⽉份对象
//getMonthValue()    int    获取当前⽇期是第⼏⽉
//getDayOfWeek()    DayOfWeek    表示该对象表示的⽇期是星期⼏
//getDayOfMonth()    int    表示该对象表示的⽇期是这个⽉第⼏天
//getDayOfYear()    int    表示该对象表示的⽇期是今年第⼏天
//withYear(int year)    LocalDate    修改当前对象的年份
//withMonth(int month)    LocalDate    修改当前对象的⽉份
//withDayOfMonth(int dayOfMonth)    LocalDate    修改当前对象在当⽉的⽇期
//plusYears(long yearsToAdd)    LocalDate    当前对象增加指定的年份数
//plusMonths(long monthsToAdd)    LocalDate    当前对象增加指定的⽉份数
//plusWeeks(long weeksToAdd)    LocalDate    当前对象增加指定的周数
//plusDays(long daysToAdd)    LocalDate    当前对象增加指定的天数
//minusYears(long yearsToSubtract)    LocalDate    当前对象减去指定的年数
//minusMonths(long monthsToSubtract)    LocalDate    当前对象减去注定的⽉数
//minusWeeks(long weeksToSubtract)    LocalDate    当前对象减去指定的周数
//minusDays(long daysToSubtract)    LocalDate    当前对象减去指定的天数//compareTo(ChronoLocalDate other)    int    ⽐较当前对象和other对象在时间上的⼤⼩,返回值如果为正,则当前对象时间较晚,
//isBefore(ChronoLocalDate other)    boolean    ⽐较当前对象⽇期是否在other对象⽇期之前
//isAfter(ChronoLocalDate other)    boolean    ⽐较当前对象⽇期是否在other对象⽇期之后
//isEqual(ChronoLocalDate other)    boolean    ⽐较两个⽇期对象是否相等
  1. 获取当前的年,月,日
LocalDate today = LocalDate.now();
System.out.println("今天日期:"+today);
//获取年月日,周几
System.out.println("现在是哪些年:"+today.getYear());
System.out.println("现在是哪些月:"+today.getMonth());
System.out.println("现在是那月数字"+today.getMonthValue());
System.out.println("现在是几号:"+today.getDayOfMonth());
System.out.println("现在是周几:"+today.getDayOfWeek());

//加减年份 返回的对象才是修改后的
LocalDate localDate = today.plusYears(1);
System.out.println("加1年后d的年份"+localDate);
//日期比较
System.out.println("isAfter:"+localDate.isAfter(today));
今天日期:2020-02-13
现在是哪些年:2020
现在是哪些月:FEBRUARY
现在是那月数字2
现在是几号:13
现在是周几:THURSDAY
加1年后d的年份2021-02-13
isAfter:true

jdk8新特性之日期格式化和计算时间差

  1. jdk8之前的日期格式化是用SimpleDateFormat()进行格式化的,但是,该函数不是线程安全的,在高并发情况下可能会出现问题。
  2. jdk8引入了线程安全的日期格式化类DateTimeFormatter

使用DateTimeFormatter.ofPattern()来格式化时间。

LocalDateTime ldt= LocalDateTime.now();
System.out.println(ldt);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dtf.format(ldt);
System.out.println(format);
  1. 通过传入数字参数格式化成标准时间
LocalDateTime of = LocalDateTime.of(2020, 11, 11, 8, 20, 30);
System.out.println(of);
  1. 计算两个日期之间的差值
LocalDateTime ldt= LocalDateTime.now();
System.out.println(ldt);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dtf.format(ldt);
System.out.println(format);
LocalDateTime of = LocalDateTime.of(2020, 2, 13, 2, 15, 30);
System.out.println(of);
Duration between = Duration.between(of, ldt);//小的时间,大的时间
System.out.println(between.toDays());//两个时间相差的天数
System.out.println(between.toHours());//两个时间相差的小时数
System.out.println(between.toMinutes());//两个时间相差的分钟数
System.out.println(between.toMillis());//两个时间相差的毫秒数
System.out.println(between.toNanos());//两个时间相差的纳秒数
System.out.println(between.getSeconds());//两个时间相差的秒数

Jdk8新特性,判断是否为空对象Optional

  1. 在开发中为了防止空指针异常,springBoot提供的方案是StringUtils.isEmpty()工具类。当查询出来数据后先进行判断一下。如果为空,就报空。就返回对应值给前端。
  2. jdk8的Optional有同样的作用。
Student student=null;
//Optional<Student> opt=Optional.of(student);//这个如果studennt为空就报异常
Optional<Student> opt=Optional.ofNullable(student);//如果为空就不报异常
if(opt.isPresent()){
    System.out.println("optional不为空");
    Student student1 = opt.get();
}else{
    System.out.println("optional为空");
}

  1. orElse()方法,进行兜底作用,即当返回的方法为空时,返回orElse()里的对象。
Student student1=null;
Student student2=new Student("2");
Student student3 = Optional.ofNullable(student1).orElse(student2);
System.out.println(student3.getAge());

用lambda表达式的写法

Student student4=null;
String s = Optional.ofNullable(student4).map(obj -> obj.getAge()).orElse("10");
System.out.println(s);