前言
随着技术的不断发展,jdk8也坐上了业界的头把交椅,在此简单叙述下8较之以往的部分新特性
一、函数式接口
函数式接口必须有且只有一个抽象方法,可有0或多个default方法,default方法无需实现,可在实现类中直接调用,可有0或多个static方法,函数式接口中的default和static方法,都可通过Interface.method()的方式直接调用,其中注解@FunctionalInterface可用来限制函数式接口不能修改为普通的接口。
需要注意以下几点:
- 当一个类实现的两个接口中有同名default方法时,该类需要重写这个default方法
- 当一个类实现的接口中的default方法m1()和这个类继承的父类中某一方法m1()重名时,那么这个类的m1()方法是继承于父类的,而不是接口中的default方法
代码如下(示例)
//接口
@FunctionalInterface
public interface InterfaceTest {
void simpleMethod();
default void defaultMethod(){
system.out.println("可直接定义方法体");
};
static void staticMethod(){
system.out.println("可直接定义方法体");
};
}
//实现类
public class lambdaTest implements LambdaInterface {
public static void main(String args[]){
//default方法无需实现,可通过实现类直接调用
new lambdaTest().defaultMethod();
//default和static方法可通过接口直接调用
LambdaInterface.defaultMethod();
LambdaInterface.staticMethod();
}
@Override
public void simpleMethod() {
system.out.println("实现的方法体");
}
}
二、Lambda表达式
我们可以把Lambda表达式可以看成匿名内部类的简写方式。前提是这个匿名内部类必须是一个函数式接口,其基本语法为:(参数列表) -> {代码块},在jdk1.8中Comparator和Runnable接口就是典型的函数式接口,下面以Comparator接口来演示
需要注意以下几点:
- 方法参数类型可省略
- 当方法参数只有一个时,圆括号可省略
- 当方法体内的代码块只有一行时,花括号可省略
- 当方法体内的代码块只有一行且有返回值时,return可省略
由于Lambda表达式的本质为匿名内部类,所以需要遵循匿名内部类的相关规则,当匿名内部类在访问外部局部变量时,变量必须为 final ,该规则在Lambda表达式中体现为:
- 在使用Lambda表达式的时候,代码块中不允许修改外部具部变量
代码如下(示例):
List<Integer> list = Arrays.asList(1,3,2);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
//根据基本语法(参数列表) -> {代码块}写为
list.sort( (Integer o1,Integer o2) -> { return o1 - o2;} );
//根据简化规则可简写为
list.sort( (o1,o2) -> o1 - o2 );
三、Optional
在日常书写代码的过程,我们需要经常对变量进行判空处理,才有可能避免空指针问题。Optional的出现在一定程度上帮我们解决了这个问题。
在这段代码中,只要user或address为空就会导致空指针
String postcode = user.getAddress().getPostcode();
如果想要避免这个问题,我们需要把代码写成这样
String postcode = "";
if(user != null){
Address address = user.getAddress();
if(address != null){
postcode = address .getPostcode();
}
}
当我们引入Optional时可以把代码写成这样
String postcode= Optional.ofNullable(user)
.flatMap(u -> u.getAddress())
.flatMap(a -> a.getCountry())
.map(c -> c.getIsocode())
.orElse("default postcode");
关于Optional现在个人只懂这么多,有内容之后再补充吧
新的特性还有stream api、新的Date类、hashMpa实现的改变,剩下的以后再说
总结
个人感觉Lambda表达式和Optional更像是语法糖,虽然会让代码看起来简洁很多,却牺牲了一部分可读性,当团队内技术水平良莠不齐的时候,这将会增大代码更新维护的成本