Lambda表达式和Stream流

文章介绍了Lambda表达式的基础,强调其需基于函数式接口,常用于方法增强和插件式编程。接着详细阐述了Lambda表达式的格式,以及常见的函数式接口如Comparator、Predicate和Function。此外,文章还探讨了Stream流的概念,将其比作数据处理的流水线,无损原数据,并列举了Stream流的关键方法,如skip、limit、sorted和collect等。
摘要由CSDN通过智能技术生成

1.Lambda表达式使用的前提 ——函数式接口

@FunctionalInterface (函数式接口)语法格式严格要求当前接口有且只能有一个尚未完成的缺省属性为public abstract修饰的方法。这是Lambda表达式和方法引用使用的前提。

函数式接口一般用于方法的增强,直接作为方法的参数使用,实现插件式编程。

2. Lambda表达式的基本格式

(联想参数临时变量)->{执行任务的代码块} ;Lambda表达式关注的是函数式接口中的方法参数和返回值,联想参数对应函数式接口中的方法参数,执行任务的代码块给出的结果对应函数式接口中方法的返回值。

3. 常见的函数式接口设计

  1. 无参无返回值(用处不大)

  1. 有参无返回值(消费者方法,数据有去无回)

  1. 无参有返回值(生产者方法)

  1. 有参有返回值(常用接口: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 类型数组返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中分头背带裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值