一、函数式接口
1.1 Lambda表达式
1.1.1 作用
用来简化匿名内部类
1.1.2 语法
( )->{ }
1.2 函数式接口
1.2.1 注意
当lambda表达式为参数的实参时,形参九必须为一个函数式接口作为形参
1.2.2 分类
Consumer<T> 消费型接口(有参数无返回值) void accept(T t)
Function<T,R>函数式接口(有参数有返回值) R apply(T t)
Supplier<T> 供给型接口(无参数有返回值) T get()
Predicate<T> 断言型接口(一个参数一个返回boolean) boolean test(T t)
1.3 方法引用
1.3.1 作用
用于简化 lambda 表达式,是lambda表达式的另外一种表达形式
1.3.2 前提
1)当lambda表达式的lambda体中的实现已经在另外一个方法中实现了,只需在lambda体中调用另一个方法 -> 可以通过方法引用那个方法
2)lambda表达式重写的方法的参数列表与返回值要与内部引用的参数列表与返回值一一对应
3)lambda返回值与内部所调用方法的方法直接对应,lambda的参数列表的第一个参数作为内部调用成员方法的对象存在,lambda的第二到多个参数直接匹配内部所调用方法的参数列表存在。
1.3.3 分类
对象::成员方法
要求:lambda表达式重写的抽象方法的参数列表与返回值对应内部所引用方法的参数列表与返回值一一对应
类名::静态方法
要求:lambda表达式重写的抽象方法的参数列表与返回值对应内部所引用方法的参数列表与返回值一一对应
类名::成员方法
要求:lambda的返回值与内部所调用方法的方法直接对应,lambda的参数列表的第一个参数作为内部调用成员方法的对象存在,lambda的第二到多个参数直接匹配内部所调用方法的参数列表存在。
二、Stream
2.1 定义
在Java8中的stream 是关注流式运算,并不是进行数据传输和存储的,
其中:io流关注数据的存储、集合与数组关注数据的存储
2.2 注意
1)Stream是一次性的流,在一次使用过后就不能重复使用
2)Stream的操作不会影响数据源中的数据
3)这是一种延迟执行(惰性加载):当获取终止行为的时候才会执行中间操作
2.3 使用步骤
1)创建、获取Stream流
2)中间行为
3)终止行为
2.4 创建Stream的方式
1)Collection Stream<E> stream( )
List<Integer> list = List.of(1,2,3,4,5);
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println);
2)Arrays stream()
String[] arr = {"abc","bbb","ccc"};
Stream<String> stream1 = Arrays.stream(arr);
stream1.forEach(System.out::println);
3)Stream of
Stream<Integer> stream2 = Stream.of(3,2,1);
stream2.forEach(System.out::println);
2.5 中间操作
2.5.1 一些常用的方法
1)过滤 Stream<T> filter(Predicate<? super T> predicate);
2)去重 Stream<T> distinct()
3)截取 Stream<T> limit(long maxSize)
4)跳过 Stream<T> skip(long)
5)排序 sorted() | sorted(Comparator<? super T> comparator)
6)映射 map(Function) :接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
2.5.2 注意
中间操作都会返回一个具有结果的新的流
三、终止行为
3.1 规约
reduce
3.2 查找
find
3.3 匹配
match
3.4 收集
collect