最近工作中用到了java 8的新版本,在使用的过程中体验到了java 8的一些新特性,网上关于这些有很多的博客介绍,我这里也不多细说,大概总结一下这些特性,然后在实战中体验这些特性带来的一些新的改变。
一、要点介绍:
1. 接口的默认方法
2. Lambda 表达式
3. 函数式接口
4. 方法与构造函数引用
5. Lambda 作用域
6. 访问局部变量
7. 访问对象字段与静态变量
8. 访问接口的默认方法
9. Annotation 注解
10. java 8定义的函数式接口
11. Date API
二、理论说明
- 接口的默认方法
Java 8可以让我们在接口添加非抽象方法的实现,只需要给该方法添加default关键字即可,这个特征又叫做扩展方法。
在java 8以前的版本,java的语法只允许在接口添加抽象方法,如果要添加实现,必须让具体实现类实现该接口。 - Lambda 表达式
Lambda 表达式是Java8的最大的特点,并蕴含着函数式编程的风格,大致语法:parameter -> expression body,可以简单的理解,箭头前是要传入的函数参数param,箭头后面是要return的返回值(根据参数写成的一个表达式,计算后得出值返回),Lambda 表达式在某些情况下可以大大的简化代码。 - 函数式接口
在java 8中,lambda表达式都对应的是接口类型,“函数式接口”则表示仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法,当然根据java 8的新特性,我们可以往这个接口里面添加带default关键字的默认方法,为了确保我们声明的接口是函数式接口,我们可以往这个接口增加注解@FunctionalInterface ,以表示它遵循函数式接口的规范,加上这个注解后,如果该接口出现超过一个的抽象方法时,编译器就会报错,函数式接口的设计其实也是为lambda表达式服务的。 - 方法与构造函数引用
Java 8 可以使用 :: 关键字来引用方法或者构造函数,比如说有一个类是Test类,我们利用新特性去创建一个对象就这样写Test test=Test :: new,一般调用构造函数都用类名 :: new的方式调用该类的构造函数;调用方法则是用该类的对象名 :: 方法名,比如Test类有一个count方法,则调用就这样写 test :: count就可以调用该方法了,还有一个经典的写法就是我们的输出语句System.out :: println,这写法跟System.out.println的实现效果是一样的,但还有一些细微的区别在后面的实战中去体会吧。 - Lambda 作用域
Lambda表达式可以直接访问外层的带final的局部变量,或者实例的字段以及静态变量 - 访问对象字段与静态变量
lambda内部对于实例的字段以及静态变量是即可读又可写 - 访问接口的默认方法
以下都是java 8的函数式接口,前面第3段有说明,函数式接口的特征是仅仅只带一个抽象函数,可以带几个有default关键字的默认函数。这些接口有Predicate接口、Function 接口、Supplier 接口、Consumer 接口、Comparator 接口、Optional 接口、Stream 接口、Filter 过滤、Sort 排序、Map 映射、Match 匹配、Count 计数、Reduce 归约、并行Streams、Map。 - Date API
Java 8 在包java.time下包含了一组全新的时间日期API,主要包含了Clock 时钟、Timezones 时区、LocalTime 本地时间、LocalDateTime 本地日期时间 - Annotation 注解
在Java 8中支持多重注解,相同的注解可以在同一个地方重复标注多次。 java 8定义的函数式接口
Predicate<T>——接收T对象并返回boolean Consumer<T>——接收T对象,不返回值 Function<T, R>——接收T对象,返回R对象 Supplier<T>——提供T对象(例如工厂),不接收值 UnaryOperator<T>——接收T对象,返回T对象 BinaryOperator<T>——接收两个T对象,返回T对象