jdk8新特性
一、lambda表达式
1、lambda表达式(包含参数和方法体)
lambda表达式可以说是匿名内部类的一种简化写法,省略了类名、方法名、类型等。
不同点(使用区别):匿名内部类可以实现接口的多个抽象方法,lambda表达式只针对有一个抽象方法的接口
说明:lambda表达式的参数对应抽象方法的参数,返回值对应抽象方法的返回值。(必须满足,不然没法用)
2、函数式接口
函数式接口就是只有一个抽象方法的接口
3、方法引用
方法引用可以说是lambda表达式的一种简化写法。
不同点(使用区别):lambda表达式的方法体已经有实现的方法时,才可以用。eg: System.out::println 替代 (str) -> System.out.println(str)
说明:
①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!格式1、2
②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式3: ClassName::MethodName
3种使用格式:
1、对象的引用 :: 实例方法名
2、类名 :: 静态方法名
3、类名 :: 实例方法名
3.2、构造器引用
构造器的参数列表,需要与函数式接口中参数列表保持一致!
使用格式: 类名 :: new
3.3、数组引用
使用格式: 类型[] :: new
4、Stream
是数据通道,用于操作数据源。不会存储元素,不改变源对象,操作是延迟执行的。可以执行复杂的查找、过滤、映射等操作。
操作步骤:1. 创建 Stream 2. 中间操作 3. 终止操作(终端操作)
4.1 、创建 Stream
Collection 提供了两个方法 stream() 与 parallelStream();
通过 Arrays 中的 stream() 获取一个数组流;
通过 Stream 类中静态方法 of();
......
4.2.、中间操作
筛选与切片
filter(Predicate p)——接收 Lambda , 从流中排除某些元素。
limit——截断流,使其元素不超过给定数量。
skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
distinct——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素;
映射
map——接收 Lambda , 将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
map类似于add方法,flatMap类似于addAll方法
排序
sorted()——自然排序
sorted(Comparator com)——定制排序
查找与匹配
allMatch——检查是否匹配所有元素
anyMatch——检查是否至少匹配一个元素
noneMatch——检查是否没有匹配的元素
findFirst——返回第一个元素
findAny——返回当前流中的任意元素
count——返回流中元素的总个数
max——返回流中最大值
min——返回流中最小值
4.3.、终止操作(终端操作)
归约
reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到一个值。
collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
分组 Collectors.groupingBy(Employee::getStatus)
分区 Collectors.partitioningBy((e) -> e.getSalary() >= 5000) ,partitioningBy可以理解为特殊的groupingBy,key值为true和false
二、Optional 容器类:用于尽量避免空指针异常
* Optional.of(T t) : 创建一个 Optional 实例
* Optional.empty() : 创建一个空的 Optional 实例
* Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
* isPresent() : 判断是否包含值
* orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
* orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
* map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
* flatMap(Function mapper):与 map 类似,要求返回值必须是Optional