Lambda 是一个匿名函数,可以把 Lambda 表达式理解为是一段可以传递的代码
Lambda 表达式的本质:作为函数式接口的实例
lambda左边 就是接口里面抽象方法的参数。
lambda右边 就是对接口抽象方法体的重写。
参数类型给定到泛型上
Lamdba若只需要一个参数时,小括号可以省略
当Lamdba体只有一条语句时,return和大括号若有,都可以省略
Comparator comparator = new Comparator函数式接口() { @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 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)
构造器和数组的引用StreamAPI方法引用:类名 ::new 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。抽象方法的返回值类型即为构造器所属的类的类型
数组引用:数组类型 [] :: new 可以把数组看做是一个特殊的类,则写法与构造器引用一致。
- Stream 关注的是对数据的运算,与 CPU 打交道;集合关注的是数据的存储,与内存打交道;
- Java 8 提供了一套 api ,使用这套 api 可以对内存中的数据进行过滤、排序、映射、归约等操作。类似于 sql 对数据库中表的相关操作。
- Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据, Stream讲的是计算!”
创建方法
- 通过集合
- 通过数组
- Stream.of()方法
筛选与切片
映射
排序
匹配雨查找
归约
收集
Optional 类的使用为了解决 java 中的空指针问题而生!
Optional
类(java.util.Optional) 是一个容器类,它可以保存类型 T 的值,代表这个值存在。或者仅仅保存 null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
常用方法



