JDK8~13新特性(附带资源下载)

JDK8~13新特性(附带资源下载)

JDK8新增的日期处理,自带加解密,Optional特性,lambada表达式,自定义的函数接口,四大接口Funtion,Consumer,Supplier,Predicate的使用,stream流的编程,核心方法map,fitter,reduce,match使用
JDK9新工具Jshell和增强API
JDK10局部变量var的使用
JDK11新标准HttpClient提交Post和Get请求
JDK13新特性文本块和增强switch

JDK8特性解读

  • JDK8下载
    window64位下载 密码:6cyj
    Linux64位下载 密码:1q5p
    Mac64位下载 密码:vqua

default关键字

在以前的接口里只能有抽象方法,不能有任何方法的实现,在jdk1.8中引入了新的关键字default,使用default修饰方法可以在接口里面定义具体的方法实现
默认方法:在接口里定义一个默认方法,接口的实现类实现的这个接口后,不用管default修饰的方法就可以直接调用。即是接口的默认方法实现

public interface Animal {
    void run();
    void eat();
    default void breath(){
        System.out.println("生物都需要呼吸");
    }
}
public class Dog implements Animal {
    @Override
    public void run() {
        System.out.println("狗");
    }

    @Override
    public void eat() {
        System.out.println("狗");
    }

新增Base6加解密API

Base64是一种基于64个可打印字符来表示二进制数据的方法,基于64个字符A~Z,a~z,0~9,+,/的编码方式,二进制数据和字符串资料之间可以相互转换。
旧版API:

		BASE64Encoder encoder=new BASE64Encoder();
        BASE64Decoder decoder=new BASE64Decoder();
        String text="加密前数据";
        byte[] bytes=text.getBytes();
        //加密
        String encodertext=encoder.encode(bytes);
        System.out.println(encodertext);
        //解码
        System.out.println(new String(decoder.decodeBuffer(encodertext),"UTF-8"));
5Yqg5a+G5YmN5pWw5o2u
加密前数据

Process finished with exit code 0

缺点:解码和编码的效率比较差,以后的版本会被取消

新版API:

        Base64.Decoder decoder= Base64.getDecoder();
        Base64.Encoder encoder=Base64.getEncoder();
        String text="加密前数据";
        byte[] bytes=text.getBytes();
        String encodetext=encoder.encodeToString(bytes);
        System.out.println(encodetext);
        System.out.println(new String(decoder.decode(encodetext),"UTF-8"));
5Yqg5a+G5YmN5pWw5o2u
加密前数据

Process finished with exit code 0
  • 日期处理类
    Java.util.Date是非线程安全的API,设计比较差,时间加减,比较麻烦,Java8 通过新发布的Date-time API(JSR310)来进一步加强时间和日期的处理,新增了很多常见的API,日期时间的比较,加减,格式化等

核心类

LocalDate:不包含时间的日期
LocalTime:不含日期的时间
LocalDateTime:包含了日期和时间

LocalDate常见的API

		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 changeDate = today.plusYears(1);
        System.out.println("加后是哪年年:"+changeDate.getYear());
        System.out.println("旧的是哪年年:"+today.getYear());
        //⽇日期⽐比较
        System.out.println("isAfter: "+changeDate.isAfter(today));
        //getYear() int 获取当前⽇日期的年份
        //getMonth() Month 获取当前⽇日期的⽉份对象
        //getMonthValue() int 获取当前⽇日期是第几⽉
        //getDayOfWeek() DayOfWeek 表示该对象表示的⽇日期是星期几
        //getDayOfMonth() int 表示该对象表示的⽇日期是这个⽉月第几天
        //getDayOfYear() int 表示该对象表示的⽇日期是今年年第⼏天
        //plusYears(long yearsToAdd)  LocalDate  当前对象增加指定的年年份数
        //plusMonths(long monthsToAdd)  LocalDate  当前对象增加指定的⽉月份数
        //plusWeeks(long weeksToAdd) LocalDate   当前对象增加指定的周数
        //minusMonths(long monthsToSubtract) LocalDate 当前对象减去注定的月数
        //isAfter(ChronoLocalDate other) boolean 比较当前对象⽇日期是否在other对象⽇日期之后
        //isEqual(ChronoLocalDate other) boolean 比较两个⽇日期对象是否相等

输出结果:

	今天日期:2019-11-19
   	现在是那年:2019
   	现在是那月:NOVEMBER
   	现在是那日:11
   	现在是几号:19
   	现在是周几:TUESDAY
   	加后是哪年年:2020
   	旧的是哪年年:2019
   	isAfter: true

   	Process finished with exit code 0

日期格式化和获得指定日期

		LocalDateTime ldt = LocalDateTime.of(2020, 11, 11, 8, 20, 30);
        System.out.println(ldt);

输出结果:

2020-11-11T08:20:30

Process finished with exit code 0

计算日期时间差

		LocalDateTime today = LocalDateTime.now();
        System.out.println(today);
        LocalDateTime changeDate = LocalDateTime.of(2020,10,1,10,40,30);
        System.out.println(changeDate);
        Duration duration = Duration.between( today,changeDate);
        //第⼆二个参数减第⼀一 个参数
        System.out.println(duration.toDays());//两个时间差的天数
        System.out.println(duration.toHours());//两个时间差的⼩小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的纳秒数

输出结果:

2019-11-19T14:33:29.947
2020-10-01T10:40:30
316
7604
456247
27374820053
27374820053000000

Process finished with exit code 0

Optional类

主要解决空指针异常(NullPointerException),本质是一个有可选值的包装类,这意味着Optional类j既可以含有对象也可以为空

  • of()
    null 值作为参数传递进去,则会抛异常
Optional<Student> opt = Optional.of(user);
  • ofNullable()
    如果对象即可能是null也可能是非null,应该使用ofNullable()方法
 Optional<Student> opt = Optional.ofNullable(user);

访问Optional对象的值

  • get()方法
 Optional<Student> opt = Optional.ofNullable(student); 
 Student s = opt.get();
  • 如果值存在isPresent()方法返回true,调用get()方法会返回该对象一般使用get之前需要验证是否有值
   public static void main(String[] args) { 
   Student student = null;
       test(student);
}

   public static void test(Student student){
   Optional<Student> opt = Optional.ofNullable(student); 
   System.out.println(opt.isPresent());
}
  • 兜底orElse方法
    如果有值就返回该值,否则返回传递给他的参数值
 
	Student student1 = null;
	Student student2 = new Student(2);
	Student result = Optional.ofNullable(student1).orElse(student2); 
	System.out.println(result.getAge());
 
	Student student = null;
	int result = Optional.ofNullable(student).map(obj- >obj.getAge()).orElse(4); 
	System.out.println(result);

lambda表达式(函数式编程)

你可能感兴趣的:(java)