1、关于JDK8之default关键字
jdk1.8以前接⼝里面是只能有抽象方法,不能有任何方法的实现的;
jdk1.8⾥面打破了了这个规定,引⼊了了新的关键字default,使⽤用default修饰⽅方法,可以在接口里面定义具体的⽅法实现;
2、新增base64加解密API
Base64是网络上最常见的⽤用于传输8Bit字节码的编码⽅式之一,Base64就是
⼀种基于64个可打印字符来表示⼆进制数据的⽅法 基于64个字符A-Z,a-z,0-9,+,/的编码方式,是⼀种能将任意二进制数据用64种字元组合成字符串的⽅法,⽽而这个二进制数据和字符串串资料料之间是可以互相转换的,在实际应⽤用上,Base64除了了能将二进制数据可视化之外,也常⽤用来表示字串加密过后的内容 ;
早期java要使⽤用Base64使⽤用JDK⾥里里sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类;缺点:编码和解码的效率⽐比较差;
jdk1.8之后java.util包中,新增了了Base64的类;好处:不⽤用引包,编解码销量量远⼤大于 sun.misc 和 Apache Commons Codec;
3、 Java新特性玩转JDK8之时间⽇日期处理理类
JDK8以前时间处理时间试用,SimpleDateFormat,Calendar等类,确定缺点: java.util.Date 是非线程安全的 API设计⽐比较差,⽇期/时间对象比较,加减麻烦;
JDK8以后:发布新的Date-Time API (JSR 310)来进⼀一步加强对⽇日期与时间的处理理
新增了了很多常见的api,如日期/时间的⽐比较,加减,格式化等
包所在位置 java.time
核⼼心类
LocalDate:不不包含具体时间的⽇日期。
LocalTime:不不含⽇日期的时间。
LocalDateTime:包含了了⽇日期及时间。
关于时间格式转换:
JDK8之前:SimpleDateFormat来进⾏行行格式化,但SimpleDateFormat并不是线程安全的JDK8之后:引⼊入线程安全的⽇日期与时间DateTimeFormatter;
4、JDK8 最重要的特性Lambda表达式
在JDK8之前,Java是不⽀持函数式编程的,所谓的函数编程,即可理理解是将⼀一个函数(也称为“⾏为”)作为⼀个参数进行传递, ⾯向对象编程是对数据的抽象(各种各的POJO类),⽽而函数式编程则是对行为的抽象(将行为作为⼀一个参数进⾏传递)
举例:创建一个线程
JDK8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1");
}
});
jdk8之后Lambda表达式则只需要使⽤用⼀一句句话
new Thread(() -> System.out.println("线程1"));
lambda表达式 使⽤用场景(前提):⼀个接⼝中只包含⼀个⽅法,则可以使⽤用Lambda表达式,这样的接⼝称之为“函数接口” 语法: (params) -> expression
第⼀部分为括号内⽤用逗号分隔的形式参数,参数是函数式接口里⾯方法的参数;
第⼆二部分为⼀一个箭头符号:->;
第三部分为⽅方法体,可以是表达式和代码块
参数列列表 :
括号中参数列列表的数据类型可以省略略不写
括号中的参数只有⼀个,那么参数类型和()都可以省略不写
⽅方法体:
如果{}中的代码只有⼀⾏,⽆论有返回值,可以省略略{},return,分号,要⼀一起省略,其他则需要加上;
好处: Lambda 表达式的实现⽅式在本质是以匿名内部类的⽅式进⾏行实现;
5、JDK8之函数式编程 Function
Lambda表达式必须先定义接口,创建相关方法之后才可使用,这样做十分不便,其实java8已经内置了了许多接口, 例如下⾯面四个功能型接口,所以一般很少会由⽤户去定义新的函数式接口
Java8的最⼤大特性就是函数式接⼝,所有标注了了@FunctionalInterface注解的接⼝口都是函数式接⼝;
Java8 内置的四⼤大核⼼心函数式接⼝口
Consumer<T> : 消费型接⼝口:有⼊入参,⽆无返回值
void accept(T t);
Supplier<T> : 供给型接⼝口:⽆无⼊入参,有返回值
T get();
Function<T, R> : 函数型接⼝口:有⼊入参,有返回值
R apply(T t);
Predicate<T> : 断⾔言型接⼝口:有⼊入参,有返回值,返回值类型确定是boolean
boolean test(T t);
Function
传⼊一个值经过函数的计算返回另⼀一个值
T:⼊入参类型,R:出参类型
调⽤用⽅方法:R apply(T t)
5、JDK8之函数式编程 BiFunction
BiFunction Function只能接收⼀个参数,如果要传递两个参数,则⽤用 BiFunction
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
6、JDK8之函数式编程 Consumer
Consumer 消费型接口:有入参,⽆返回值
将 T 作为输入,不返回任何内容
调⽤用⽅方法:void accept(T t);
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
⽤途: 因为没有出参,常⽤于打印、发送短信等消费动作
7、JDK8之函数式编程 Supplier
Supplier: 供给型接口:⽆⼊参,有返回值
T:出参类型;没有⼊参
调⽤用⽅方法:T get();
@FunctionalInterface
public interface Supplier<T> {
T get();
}
用途: 泛型一定和⽅法的返回值类型是一种类型,如果需要获得一个数据,并且不需要传⼊参数,可
以使⽤用Supplier接口,例如 无参的⼯厂方法,即⼯厂设计模式创建对象,简单来说就是提供者
8、JDK8之函数式编程 Predicate
Predicate: 断言型接口:有⼊参,有返回值,返回值类型确定是boolean
T:⼊参类型;出参类型是Boolean
调⽤方法:boolean test(T t);
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
用途: 接收一个参数,⽤于判断是否满足一定的条件,过滤数据