1.Lambda表达式使用的前提 ——函数式接口
@FunctionalInterface (函数式接口)语法格式严格要求当前接口有且只能有一个尚未完成的缺省属性为public abstract修饰的方法。这是Lambda表达式和方法引用使用的前提。
函数式接口一般用于方法的增强,直接作为方法的参数使用,实现插件式编程。
2. Lambda表达式的基本格式
(联想参数临时变量)->{执行任务的代码块} ;Lambda表达式关注的是函数式接口中的方法参数和返回值,联想参数对应函数式接口中的方法参数,执行任务的代码块给出的结果对应函数式接口中方法的返回值。
3. 常见的函数式接口设计
无参无返回值(用处不大)
有参无返回值(消费者方法,数据有去无回)
无参有返回值(生产者方法)
有参有返回值(常用接口:1比较器接口,参数是用户指定类型的两个泛型参数,返回值是int类型,0表示两个元素一致;2过滤器接口,参数是用户使用时约束泛型对应的具体数据类型参数,返回值是boolean类型,对数据进行判断并给出结果反馈;3类型转换接口,参数是用户实例化对象时约束的具体数据类型,返回值是用户指定的具体数据类型,用于类型的转换。)
代码案例:
比较器接口:
@FunctionalInterface
interface Comparator<T> {
/**
* 比较器接口要求的方法,参数是泛型参数,用户指定类型
* @param o1 用户在使用接口时约束的泛型对应具体数据类型参数
* @param o2 用户在使用接口时约束的泛型对应具体数据类型参数
* @return 返回值为 int 类型,0 表示两个元素一致。
*/
int compare(T o1, T o2);
}
过滤器接口:
@FunctionalInterface
interface Predicate<T> {
/**
* 过滤器接口约束的方法,方法参数是用户使用时约束泛型对应具体数据参数
* 返回值类型是 boolean 类型,用于条件判断,数据过来
* @param t 用户约束泛型对应的具体数据类型参数
* @return boolean 数据,判断结果反馈
*/
boolean test(T t);
}
类型转换接口:
@FunctionalInterface
interface Function<T, R> {
R apply(T t);
}
4. Stream流概述
Stream流是将需要处理的集合数据看做一条流水线,在这条流水线上对数据进行筛选,排序,转换类型,限制个数,最终处理等加工。并且在处理数据的过程中,对于数据的原始空间没有任何的修改,不影响原始数据。
4.1 Stream流的相关方法
4.1.1 Stream流处理的是集合 或者 数组
// 集合对象
Stream<T> stream();
集合对象调用可以直接获取对应当前集合存储元素的 Stream 流对象。
// 数组
Stream<T> Arrays.Stream(T[] t);
利用 Arrays 工具类对当前需要按照 Stream 流方式操作的数据进行转换操作,根据当前数组的数据类型和数据存储情况,返回一个对应的 Stream 流对象
4.1.2 Stream流处理数据的中间方法
Stream<T> skip(long n);
限制跳过当前 Stream 流对应元素的个数,【掐头】
Stream<T> limit(long n);
限制当前 Stream 对应的元素总个数,【去尾】
Stream<T> sorted();
对当前 Stream 流存储的进行排序操作,要求元素有自然顺序或者遵从 Comparable 接口,默认【升序】
Stream<T> sorted(Comparator<? super T> com);
对当前 Stream 流存储的进行排序操作,排序规则由 Comparator 函数式接口规范
Stream<T> filter(Predicate<? super T> pre);
判断过滤当前 Stream 流可以保存的数据条件,满足条件保留,不满足条件移除,过滤规则由 Predicate 接口约束
Stream<T> distinct();
当前 Stream 流中对应的所有元素去重擦操作
Stream<R> map(Function<T, R> fun);
当前 Stream 存储的数据情况转换为 Function 函数式接口要求的返回值类型,完成类型转换操作。
4.1.3 Stream流处理数据的最终方法
执行该方法后对应的Stream流会自动关闭,对应Stream占用的资源空间会被JVM收回。
long count();
返回当前 Stream 流对应的数据元素个数,为终止方法。
void forEach(Consumer<? super T> con);
针对于当前 Stream 存储元素的处置方法,为终止方法。
<R, A> R collect(Collector<? super T, A, R> collector);
Stream 流对应的元素存储内容,转换为用户要求的 集合对象。终止方法
常用:
Collectors.toList() 目标存储集合类型为 List 集合
Collectors.toSet() 目标存储集合类型为 Set 集合
Object[] toArray();
Stream 流存储的元素内容转换为 Object 类型数组返回