JDK8
全部特性:1.允许在接口中有默认方法实现
2.Lambda表达式
3.函数式接口
4.方法和构造函数引用
5.Lambda的范围
6.内置函数式接口
7.Streams
8.Parallel Streams
9.Map
10.时间日期API
11.Annotations
Java 8 允许我们使用default关键字,为接口声明添加非抽象的方法实现。这个特性又被称为扩展方法。
于是接口可以这么写……
public interface testInterface {
double addSomething(int a);
default double addSomething(int a,int b){
return a+ b;
}
}
这意味着……接口就是半个抽象类……每个接口可以自带一个实现方法……
以前各种教材里写的接口全部都是非实现方法的定义需要修改了……
Lambda更像是用来简写匿名内部类,匿名方法等等。第一个特性完全就是为了配合lambda语法……
public class LambdaNames {
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
public void myFunction(){
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
}
等同于如下代码
public void myLambdaFunction(){
Collections.sort(names,(String a,String b)->{
return b.compareTo(a);
});
}
/**
* 只要一行代码,包含了方法体。你甚至可以连大括号对{}和return关键字都省略不要
*/
public void myLambdaFunction2(){
Collections.sort(names,(String a,String b) -> b.compareTo(a));
}
/*
*Java编译器能够自动识别参数的类型,所以你就可以省略掉类型不写
*/
public void myLambdaFunction3(){
Collections.sort(names,(a,b)->b.compareTo(a));
}
说明:
1、每一个lambda都能够通过一个特定的接口,与一个给定的类型进行匹配。
2、一个所谓的函数式接口必须要有且仅有一个抽象方法声明。
3、每个与之对应的lambda表达式必须要与抽象方法的声明相匹配。
*4、由于默认方法不是抽象的,因此你可以在你的函数式接口里任意添加默认方法。
5、 任意只包含一个抽象方法的接口,我们都可以用来做成lambda表达式。
6、 为了让你定义的接口满足要求,你应当在接口前加上@FunctionalInterface 标注。
7、编译器会注意到这个标注,如果你的接口中定义了第二个抽象方法的话,编译器会抛出异常。