14.1lambda表达式
14.1.1表达式简介
lambda表达式可以用非常少的代码实现抽象方法。lambda表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。lambda表达式的语法非常特殊
()->结果表达式/代码块
参数->结果表达式/代码块
(参数1,参数2...参数n)->结果表达式/代码块
14.1.2lambda表达式实现函数式接口
1.函数式接口
函数式接口指的是仅包含一个抽象方法的接口
interface MyInterface{
void method();
}
2.lambda表达式实现无参抽象方法
3. lambda表达式实现有参抽象方法
4.lambda表达式使用代码块
当函数接口的抽象方法需要实现复杂逻辑而不是返回一个简单的表达式的话,就需要在lambda表达式中使用代码块,lambda表达式会自动判断返回值类型是否符合抽象方法的定义。
14.1.3lambda表达式调用外部遍历
14.1.4lambda表达式与异常处理
14.2方法的引用
lambda表达式还添加了一类新语法,用来引用方法,也就是说方法也可以作为一个对象被调用。根据不同的方法类型,方法的引用就包括经他方法,引用成员方法,引用构造方法等。
14.2.1引用静态方法
引用静态方法的语法如下:
类名::静态方法名
14.2.2引用成员方法
引用成员方法的语法
对象名::成员方法名
14.2.3引用泛型的方法
“::”操作符支持引用泛型方法,也可支持引用带泛型的类。
14.2.4引用构造方法
1.引用无参构造方法
引用构造方法的语法如下
类名::new
2.引用有参构造方法
3.引用数组构造方法
语法如下
类名【】::new
12.2.5Fuction接口
14.3流处理
流处理有点类似数据库SQL语句,可以执行非常复杂的过滤、映射、查找和收集功能,并且代码量很少。唯一的缺点式代码可读性不高,如果开发者基础不好,可能会看不懂流API所表达的含义。
14.3.1Stream接口简介
流处理的接口定义在java.uil.stream包下。BaseStream接口是最基础的接口,但最常用的是BaseStream接口的子接口--Stream接口,基本上绝大多数的流处理都是在Steam接口上实现的。
Stream接口是泛型接口,所以流中操作的元素可以是任何类的对象。
Collection接口新增两个可以获取流对象的方法,
获取集合的顺序流
Stream<E>stream();
获取集合的并行流
Stream<E>parallelstream();
因为所有集合类都是 Collection接口的子类,所以这些类都可以进行流处理
List<Integer>list=new ArrarList<Integer>();
Stream<Integer>s=list.stream();
14.3.2Optional类
Optional 类像是一个容器,可以保存任何对象,并且针对NullPointerException空指针异常做了优化,保证Optional类保存的值不会是null。因此,Optional类是针对“对象可能是null 也可能不是null”的场景为开发者提供了优质的解决方案,减少了烦琐的异常处理。
Optional 类是用final修饰的,所以不能有子类。Optional类是带有泛型的类,所以该类可以保存任何对象的值。
从Optional类的声明代码中就可以看出这些特性,JDK中的部分代码如下:
public final class Optional<T>{
private final T value;
*** //省略其他代码
14.3.3Collectors类
Collectors类为收集器类,该类实现了java.util.Collector接口,可以将Stream流对象进行各种各样的封装、归集、分组等操作,还提供了很多使用的数据加工方法,如数据统计计算等。