jdk8新特性
lambda表达式
Lambda 是一个匿名函数,可以把 Lambda 表达式理解为是一段可以传递的代码
Lambda 表达式的本质:作为函数式接口的实例
lambda左边 就是接口里面抽象方法的参数。
lambda右边 就是对接口抽象方法体的重写。
参数类型给定到泛型上
Lamdba若只需要一个参数时,小括号可以省略
当Lamdba体只有一条语句时,return和大括号若有,都可以省略
Comparator comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
System.out.println(comparator.compare(1, 2));
//lambda写法
Comparator c = (o1, o2) -> {
return 0;
};
Comparator<Integer> c2 = (o1, o2) -> o1-o2;
函数式接口
只包含一个抽象方法的接口,称为函数式接口。接口上用@FunctionalInterface标识
四大核心函数式接口
方法的引用
方法引用可以看做是 Lambda 表达式深层次的表达。换句话说,方法引用就是 Lambda 表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法。
类(或对象) :: 方法名
要求接口中的抽象方法的 形参列表 和 返回值类型 与方法引用的方法的形参列表和返回值类型相同!
//Consumer void accept(T t)
//PrintStream void println(T t)
PrintStream ps=System.out;
Consumer con1= ps :: println;
- 情况1 对象
::
非静态方法 - 情况2 类
::
静态方法 - 情况3 类
::
非静态方法
当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数)时:ClassName::methodName
(针对于情况3)
构造器和数组的引用
方法引用:类名
::new
和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。抽象方法的返回值类型即为构造器所属的类的类型数组引用:数组类型
[] :: new
可以把数组看做是一个特殊的类,则写法与构造器引用一致。
StreamAPI
Stream
关注的是对数据的运算,与CPU
打交道;集合关注的是数据的存储,与内存打交道;- Java 8 提供了一套
api
,使用这套api
可以对内存中的数据进行过滤、排序、映射、归约等操作。类似于sql
对数据库中表的相关操作。 Stream
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据, Stream讲的是计算!”
创建方法
- 通过集合
- 通过数组
- Stream.of()方法
中间操作
筛选与切片
映射
排序
终止操作
匹配雨查找
归约
收集
Optional 类的使用
为了解决 java 中的空指针问题而生!
Optional<T> 类(java.util.Optional)
是一个容器类,它可以保存类型T
的值,代表这个值存在。或者仅仅保存null
,表示这个值不存在。原来用null
表示一个值不存在,现在Optional
可以更好的表达这个概念。并且可以避免空指针异常。
常用方法