lambda表达式与Stream流
Lambda表达式
Lambda表达式出现主要是为了简化代码,若某一个接口只有一个抽象方法,就能使用Lambda表达式来进行简化这个接口的实现类。
Lambda表达式的六种情况
1 | // 1 无参,无返回值 |
Java内置的四大核心函数式接口
Consumer<T>消费型接口 对T进行操作,不返回结果,方法为
void accept(T t)Supplier<T>供给型接口 不接收参数,返回类型T的数据,方法为
T get()Function<T,R>函数型接口 对类型为T的对象操作,返回R类型的数据,方法为
R apply(T t)Predicate<T>断定型接口 对类型T的数据进行判断,返回Boolean值,方法为
boolean test(T t)
方法引用
在lambda体中引用另一个方法,即用另一个方法来实现lambda体。
使用格式 类(或对象):: 方法名
- 对象::非静态方法
- 类::静态方法
- 类::非静态方法
方法引用的方法的形参列表和返回类型要与lambda一样才能使用该方法引用(针对于前两种格式)
主要是第三种格式有些难懂。
1 | // 比如 Comparator 中的int compare(T1 t1, T2 t2) |
构造器引用
相当于lambda引用中创建一个对象,调用了一个构造方法。
1 | // lambda表达式写法 |
Stream流
Stream流的使用主要分为三个步骤。
- 创建Stream流。从数据源(集合,数组等)转换成Stream流。
- 中间操作。对数据源的数据进行处理。
- 终止操作。执行终止操作,就会执行中间操作的处理,产生结果。
创建Stream流
- 集合获取Stream流的方法
list.stream()串行list.paralleStream()并行
- 数组获取Stream流的方法
- 通过Arrays的静态方法stream()得到Stream流
Arrays.stream(int[])
- 通过Arrays的静态方法stream()得到Stream流
- 通过
Stream.of()来获取Stream流 - 创建无限流(用于编造数据)
Stream.iterate()Stream.generate()
Stream流的中间操作
筛选与切片
filter(Predicate p)从流中排除某些元素,即满足Predicate函数的元素
limit(n)截断流,使其元素不超过给定的元素,即筛选出来的元素不超过n
skip(n)跳过元素,返回一个除了前n个数据的流,若数据源不足n个,则返回空流
distinct()通过流生成元素的hashCode和equals方法去除重复的元素
映射
map(Function f)接收一个函数作为参数,将元素转换成其他形式或提取信息
flatMap(Function f)将一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
排序
sorted()没有参数,自然排序,默认从小到大的排序,如果操作的元素是类,就会抛出异常,需要该类实现Comparable接口
sorted(Comparator com)一个Comparator实例,定制排序
Stream流的终止操作
匹配与查找
boolean allMatch(Predicate p)检查是否所有元素是否匹配该断定函数接口
boolean anyMatch(Predicate p)检查是否至少有一个元素匹配该断定函数接口
boolean noneMatch(Predicate p)检查是否没有元素匹配该断定函数接口
findFirst()返回第一个元素
findAny()返回任意一个元素
count()返回流中的总个数
max(Comparator c)返回流中的最大值
min(Comparator c)返回流中的最小值
forEach(Consumer c)内部迭代
归约
reduce(T identity, BinaryOperator<T> bin)可以将流中元素反复结合起来得到一个值,返回这个T类型的值
比如这个求和的例子
list.stream.reduce(0, Integer::sum);reduce(BinaryOperator<T> bin)可以将流中元素反复结合起来得到一个值,返回这个
Optional<T>类型的值
收集
collect(Collector c)
将流转换为其他形式的数据源,调用这个Collector接口的方法得到新建数据源
一般使用实现了接口的Collectors的类的方法
常用方法为
List<T> toList()将元素收集到创建的List
Set<t> toSet()将元素收集到创建的Set
Collection<T> toCollection()将元素收集到创建的Collection
Long counting()计算流中的个数
Integer summingInt()对流中元素的整数属性求和
Double averagingInt()求流中的元素Integer属性的平均值
Optional容器类
Optional<T>类是一个容器类,可以报错类型T的值,代表这个值存在。
或者仅仅保存null,表示这个值不存在,可以避免空指针异常
如果值存在,则isPresent()方法返回true,调用get()方法会返回该对象
创建Optional类对象的方法
Optional.of(T t)创建一个实例,t是非空的
Optional.isEmpty()创建一个空的实例
Optional.ofNullable(T t)创建一个实例,t是可以空的
判断Optional中是否包含对象
boolean isPresent()判断是否包含对象
void ifPresent(Consumer<? super T> consumer)如果有值就会执行Consumer接口的实现代码,并且会作为参数传给它
获取Optional容器的对象
T get()如果调用对象包含值,则返回该值,否则抛异常
T orElse(T other)如果有值则返回,没有返回指定的other值
T orElseGet(Supplier<? extends T> other)如果有值就将其返回,否则返回由Supplier接口实现提供的对象
T orElseThrow(Supplier<? extends X> exceptionSupplier)如果有值就将其返回,否则抛出由Supplier接口实现提供的异常
