一、接口的默认方法
允许我们给接口添加一个非抽象方法的实现,只需要使用default关键字即可,这个特征叫做拓展方法。
interface Test2 {
default void Method() {
System.out.println("方法的实现");
}
}
public class Test implements Test2 {
public static void main(String[] args) {
Test2 test2 = new Test();
test2.Method();
}
}
二、Lambda表达式
lambda表达式中访问外层作用域和之前匿名对象中的房方式很相似。
Java编译器可以自动推导出参数类型。
List<String> names = Arrays.asList(new String[]{"fa", "bfg", "cd", "dF", "dr"});
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
Collections.sort(names, (a, b) -> b.compareTo(a));
for (String s : names) {
System.out.println(s);
}
三、函数式接口(参考菜鸟教程:https://www.runoob.com/java/java8-functional-interfaces.html)
就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
那么就可以使用Lambda表达式来表示该接口的一个实现。
GreetingService greetService1 = message -> System.out.println("Hello " + message);
四、方法与构造函数引用
Java8允许你使用::关键字来传递方法或者构造函数引用。
有一个Person类,一个PersonFactory对象接口。
PersonFactory PersonFactory=Person::new;
Person person=PersonFactory.create(“lisi”,“女”);
我们只使用Person::new来获取Person类构造函数的引用,Java编译器会根据PersonFactory.create()方法的签名来选择合适的构造函数。
五、访问局部变量
我们可以直接在lambda表达式中直接访问外层中的局部变量,可以不用向匿名内部类一样,给变量添加final关键字,但是这个变量必须不可被后面的代码修改(隐形的具有final的语义)。
六、访问对象字段与静态变量
和本地变量不同的是,lambda内部对于实例的字段以及静态变量即可读又可写
七、访问接口的默认方法
一个接口的默认方法可以直接被匿名对象访问到,但是lambda表达式中是不行的。
八、Date API
Clock时钟、Timezones时区、LocalTime本地时间…(具体后续补充)
九、Annotation注解
后续继续补充,如有不对欢迎指正。