介绍一下Java 8中新增的特性,这些特性平时不用也不影响编码,但是如果用上了会大大提高编程效率,同时让人感觉你很professional。
主要参考以下两个项目:
Lambda表达式
先看一个降序排列字符串的例子,传统写法:
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
只需要给静态方法 Collections.sort
传入一个 List
对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给 sort
方法。
Java8中使用 lambda 表达式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
对于函数体只有一行代码的,你可以去掉大括号{}以及 return
关键字,让它再次简短:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
List
类本身就有一个 sort
方法。并且Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。这样可以更加简短:
names.sort((a, b) -> b.compareTo(a));
Lambda表达式作用域
本部分讨论 lambda 表达式访问外部变量的作用域。
访问局部变量
lambda 表达式支持访问局部变量,而且不需要像匿名函数一样将变量声明为final
。
int num = 1;
Function<Integer, Integer> add = a -> (a + num);
System.out.println(add.apply(111)); // 112
不过这个局部变量必须不可被后面的代码修改(即隐性的具有 final
的语义),例如下面的就无法编译:
int num = 1;
Function<Integer, Integer> add = a -> (a + num);
System.out.println(add.apply(111)); // 112
num = 2;
访问字段和静态变量
与局部变量相比,我们对 lambda 表达式中的实例字段和静态变量都有读写访问权限。 该行为和匿名对象是一致的。
public class App {
static int num = 1;
public static void main(String[] args) {
Function<Integer, Integer> add = a -> (a + num);
System.out.println(add.apply(111)); // 112
num = 2;
System.out.println(num); // 2
}
}
访问默认接口方法
lambda 表达式无法访问默认接口方法。
网友评论