Java代码片段工具篇之StreamFilter过滤器简化写法

代码片段系列, 前面写了一个日期生成工具,受到很多同学的关注,再次在分享一个小编在业务中简化代码的过滤。
并没有技术难度和技巧,仅仅是对原生lambda的封装,简化使用语法。

JDK原生过滤器语法

其实很简单的过滤,但是使用JDK原生语法时候必须要.collect(Collector.toList)。如果当你已经明确要生成List
集合时候,这句就变得很多余,想想一下如果代码中出现很多这种多余的语法。其实是很糟糕的。

本文是对lambda语法过滤方法的封装,拿去使用即可。

1. 根据条件生成List集合

    /**
     * 根据条件生成List集合
     *
     * @param dataStream 数据流
     * @param predicate  过滤条件
     * @param <T>        数据泛型
     * @return List
     */
    public static <T> List<T> filter(Stream<T> dataStream, Predicate<? super T> predicate) {
        return dataStream.filter(predicate).collect(Collectors.toList());
    }

2. 根据条件过滤并转换生成新List集合

    /**
     * 根据条件过滤并转换生成新的list
     * @param dataStream   数据流
     * @param predicate    过滤条件
     * @param applyMapping 数据类型转换函数
     * @param <T>          原始数据类型
     * @param <V>          新数据类型
     * @return List
     */
    public static <T, V> List<V> filter(Stream<T> dataStream, Predicate<? super T> predicate,
                                        Function<? super T, ? extends V> applyMapping) {
        return dataStream.filter(predicate).map(applyMapping).collect(Collectors.toList());
    }

3. 查询唯一数据

    /**
     * 查询唯一数据
     *
     * @param dataStream 数据流
     * @param predicate  过滤条件
     * @param <T>        数据泛型
     * @return List
     */
    public static <T> Optional<T> filterSingle(Stream<T> dataStream, Predicate<? super T> predicate) {
        List<T> filter = filter(dataStream, predicate);
        if (filter == null || filter.isEmpty()) {
            return Optional.empty();
        }
        if (filter.size() > 1) {
            throw new DuplicateFormatFlagsException(filter.toString());
        }
        return Optional.ofNullable(filter.get(0));
    }

4. 查询唯一数据(并指定异常类型)

    /**
     * 查询唯一数据并制定异常
     *
     * @param dataStream        数据流
     * @param predicate         过滤条件
     * @param <T>               数据泛型
     * @param exceptionSupplier 异常生成
     * @param <X>               异常泛型
     * @return List
     * @throws X Throwable
     */
    public static <T, X extends Throwable> T filterSingle(Stream<T> dataStream,
                                                          Predicate<? super T> predicate,
                                                          Supplier<? extends X> exceptionSupplier) throws X {
        List<T> filter = filter(dataStream, predicate);
        if (filter == null || filter.isEmpty()) {
            throw exceptionSupplier.get();
        }
        if (filter.size() > 1) {
            throw exceptionSupplier.get();
        }
        return filter.get(0);
    }

5. 使用方法

        <dependency>
            <groupId>com.hanframework</groupId>
            <artifactId>common-toolkit</artifactId>
            <version>1.0.0-RELEASE</version>
        </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西魏陶渊明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值