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

JDK原生过滤器语法

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

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

本文是对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>