Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional
程序员文章站
2022-06-07 13:11:26
...
Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional
文章目录
jdk8新特性重点内容
- 日期
- lambda表达式
- 函数式编程
- Stream流
- 一些其他内容。
jdk8是目前最成功的版本。未来2-3年最常用的版本。
各种系统安装jdk8教程
jdk8新特性之default关键字
- jdk8之前,接口里面只能有抽象方法,不能有任何方法实现的。
- jdk8里面打破了这个规定,引入了新的关键字default,使用default修饰方法,可以在接口里面定义具体的方法实现。接口里面可以定义两种方法实现。默认方法和静态方法。
- 默认方法: 接口里面定义一个默认方法,这个接口的实现类实现了这个接口后,不用管这个default修饰的方法,就可以直接调用,即接口方法的默认实现。
接口中写方法也就意味着,不用写该方法的实现方法了,直接在接口的方法体中写了。
public interface Animal {
void eat();//不写修饰符,表示是public
void run();
default void breath(){
System.out.println("使用氧气呼吸");
}
}
- **静态方法:**可以通过接口名 . 静态方法来访问接口中的静态方法。
public interface Animal {
void eat();//不写修饰符,表示是public
void run();
default void breath(){
System.out.println("使用氧气呼吸");
}
static void test(){
System.out.println("这个是静态方法");
}
}
使用场景:接口里面定义公用的业务逻辑,抽取出来,每个子类都必须具备。
Jdk8新特性之新增Base64 API
- Base64编码
Base64是网络上最常见的用于传输8Bit字节的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。基于64个字符A-Z,a-z,0-9,+,/的编码方式。是一种能将任意二进制数据用64种子元组合成字符串的方法。这个二进制和字符串资料之间是可以相互转换的。 实际应用中Base64除了能将二进制数据可视化之外,也常用来表示字符串加密后的内容。
- 在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"));
- 使用Apache Commons codec中的包进行转换。但是需要引用第三方包。
- 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新特性之日期处理类
- 之前时间处理类有:SimpleDateFormat,Calendar,Date等类。但是缺点是:
java.util.Date是非线程安全的。日期比较相对麻烦,比如,比较两个日期相差几分钟,几天?加减麻烦。
-
新增的时间API在java.Time包下。
-
核心类:
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 ⽐较两个⽇期对象是否相等
- 获取当前的年,月,日
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新特性之日期格式化和计算时间差
- jdk8之前的日期格式化是用SimpleDateFormat()进行格式化的,但是,该函数不是线程安全的,在高并发情况下可能会出现问题。
- 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);
- 通过传入数字参数格式化成标准时间
LocalDateTime of = LocalDateTime.of(2020, 11, 11, 8, 20, 30);
System.out.println(of);
- 计算两个日期之间的差值
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
- 在开发中为了防止空指针异常,springBoot提供的方案是StringUtils.isEmpty()工具类。当查询出来数据后先进行判断一下。如果为空,就报空。就返回对应值给前端。
- 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为空");
}
- 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);
上一篇: 第九节:解决跨域问题与实现品牌查询
下一篇: vue项目实现页面的跳转