目前Java8已经发布了很长一段时间,自己一直还停留在Java7中,为了更上技术更新的步伐,总结并学习下Java8中的新特性。
一.Java8语言新特性
1.lambda表达式
也许是长时间习惯了Java7,或者自己对函数式编程不是很了解,刚接触lambda表达式时感觉这种风格非常别扭,并没有使代码可读性变强,也许等自己熟练了以后才能明白其中的奥秘吧。lambda表达式作为Java8中最大的卖点,实现了可以将函数作为一个参数进行传递,以前我们想这样做必须要使用匿名类来实现。例如我们如果想实例化一个线程在Java8之前可以这样做:
public class Main {
public static void main(String[] args) {
//Java7
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ccc");
}
}).start();
//Java8
new Thread(()-> System.out.println("ccc")).start();
}
}
有了Java8之后我们可以直接使用lambda表达式new Thread(()-> System.out.println("ccc")).start();来实现,可见lambda表达式大大简化了代码。然后大多数情况下我们的函数体不光就是一段代码,可能会有多段代码,这样使用lambda表达式可以通过一个大括号来标识函数体,例如:
new Thread(()->{
System.out.println("this is a thread");
System.out.println(Thread.currentThread().getName());
}).start();
如果函数只有一个参数,对于lambda表达式而言可以进行省略直接用()代替,如果你的函数又多个参数可以用(int a,int b)->来描述。
2.接口的默认方法与静态方法
在Java8之前,接口是没有默认方法和静态方法,Java8让接口拥有的默认方法和静态方法来扩展接口。默认方法跟普通方法以及抽象方法还不一样,后者都要实现,而默认方法无需实现。以前我们想要在接口中新增一个方法必须改改动继承并实现这个接口的所有代码。默认方法给我们带来这个好处,在接口中新增一个方法能够实现对老的代码兼容。其它接口默认继承了这个方法,这样我们无需改动代码就能实现对接口的兼容性。例如:
public interface InputFactory {
void addInput();
}
我们有个输入工厂接口,里面有很多类实现了这个接口,某天我们需要为这个接口增加一个方法,例如增加一方法fee(),在Java8之前我们需要修改实现该方法的所有实现类,有了Java'8之后我们仅仅需要一个默认方法就能搞定,
public interface InputFactory {
void addInput();
default void fee() {
// TODO: 2017/7/30
}
}
试下该接口的所有类默认拥有了该方法的功能,可以调用该方法。如果继承了该接口将会有三种情况:
(1).不去管默认方法,继承的接口直接继承默认方法。
(2).重新声明默认方法,默认方法将成为抽象方法。
(3).实现默认方法,默认方法将被覆盖。
静态方法跟默认方法类似,提供一个方法可以兼容所有实现类,但是不能够被覆盖。例如:
public interface InputFactory {
void addInput();
default void fee() {
// TODO: 2017/7/30
}
static void getInput(){
// TODO: 2017/7/30
}
}