Java 8 新特性
Java 8 又称 JDK 1.8,速度更快,便于并行,JVM 上可以运行 JS 应用.
最重要的两个新特执 Lambda, Stream API
接口的增强
-
静态方法
-
默认方法
提供了新的日期 API
注解
-
重复注解
-
类型注解
集合 引入红黑树
JDK 的更新
新的编译工具
-
jjs
-
jdeps
JVM
Meta space 取代 PermGen 空间
其它
通用目标类判断
Lambda 表达式
(chapter 23)
语法层面的改变,箭头操作符,简化匿名内部类,匿名内部类中只有一个抽象方法,只能重写此方法
= () -> 方法体
-
-> : lambda 操作符,箭头操作符
-
():lambda 形参列表,抽象方法的形参列表
-
方法体:lambda 方法体
lambda 表达式的六种使用:
-
无参数无返回
-
需要一个参数,但是没有返回值
-
数据类型可以省略,编译器可以自己推断
-
若参数只有一个,小括号也可以省略
-
方法体用{ },可以写多条处理语句和返回值
-
只有一条语句是可以省略{},这条语句有 return 时 也可省略
lambda 表达式的总结:
-
对于参数列表(),可以省略类型,若只有一个参数还可以省略()
-
对于方法体{},可以写多条处理语句。若只有一条,可以省略{}。若只有 return,省略 return。
lanmda 表达式的本质:作为函数接口的实例,接口中只有一个抽象方法,只能重写此方法。
public class LambdaTest { @Test public void test1(){ Runnable r1 = new Runnable() { @Override public void run() { System.out.println("为引入 lambda"); } }; r1.run(); Runnable r2 = () -> System.out.println("引入 lambda"); r2.run(); } @Test public void test2(){ Comparator<Integer> com1 = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o2, o1); } }; System.out.println(com1.compare(12,22)); //lambda 表达式 Comparator<Integer> com2 = (Integer o1, Integer o2) ->Integer.compare(o2, o1); System.out.println(com2.compare(92,22)); //方法引用 Comparator<Integer> com3 = Integer :: compare; System.out.println(com3.compare(92,22)); } }
函数式接口
此接口只能有一个方法。
@FunctionalInterface
方法引用与构造器引用
本质就是 lambda 表达式,lambda 表达式是函数接口的实例,所以引用也是函数接口的实例。
格式: 类(对象) :: 方法名
方法引用的使用情境:
-
当要传递给 lambda 体的操作,已经有实现的方法了,可以使用方法引用。
三种情况:
-
对象 :: 非静态方法
-
类 :: 静态方法
-
类 :: 非静态方法(实例方法)
使用要求:要求接口中的抽象方法的形参列表和返回值类型 与 方法引用的方法的形参列表和返回值类型相同(1,2)
构造器引用:和方法引用类似,接口中的抽象方法的形参列表和返回值类型 与 构造器的形参列表和返回值类型相同。抽象发放的返回值类型即为构造器所属的类的类型
数组引用:大家可以把数组看成一个特殊的类,则写法与构造器引用一致。
强大的 Stream API
提供了一种高效且易于使用的处理数据的方式。对数据进行操作、计算。集合讲的是数据,Stream 讲的是计算。
细节:
-
Stream 不会存储元素
-
Stream 不会改变源对象。相反他们返回一个持有结果的新 Stream
-
Stream 操作是延迟执行的,这意味他们会等到需要结果时才执行。
实际开发中,项目的多数数据源来自于 MySql、Oracle 等,但现在数据源更多了,比如 MongDB、Redis 等,而这些(NoSql)的数据就需要 Java 层面去处理。
中间操作:筛选、过滤、映射(map,flatmap)、排序
中止操作:匹配与查找(allMatch、anyMatch、noneMatch)、归约、收集
-
parallel()并行流
-
sequential()顺序流
Optional 类
是一个容器类,把泛型<T>进行一个封装,减少空指针异常。