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

举报
西魏陶渊明 发表于 2022/09/25 02:50:38 2022/09/25
【摘要】 代码片段系列, 前面写了一个日期生成工具,受到很多同学的关注,再次在分享一个小编在业务中简化代码的过滤。 并没有技术难度和技巧,仅仅是对原生lambda的封装,简化使用语法。 JDK原生过滤器语法 其...

代码片段系列, 前面写了一个日期生成工具,受到很多同学的关注,再次在分享一个小编在业务中简化代码的过滤。
并没有技术难度和技巧,仅仅是对原生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());
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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());
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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));
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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);
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

5. 使用方法

        <dependency>
            <groupId>com.hanframework</groupId>
            <artifactId>common-toolkit</artifactId>
            <version>1.0.0-RELEASE</version>
        </dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/105872376

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。