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

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

文章目录

      • Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional
        • jdk8新特性重点内容
        • jdk8新特性之default关键字
        • Jdk8新特性之新增Base64 API
        • JDK8新特性之日期处理类
        • jdk8新特性之日期格式化和计算时间差
        • Jdk8新特性,判断是否为空对象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 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);

你可能感兴趣的:(java基础笔记)