在 Java 中为列表过滤编写和过滤器的简洁方法

Clean way to write AND filters for List filtering in Java

有一项服务接受四个参数,这些参数用于从缓存存储中过滤数据,return结果作为列表。

假设任何和所有参数都可以为 null 或为空,它仍然需要 return 根据其余参数匹配数据(return 未过滤的数据,如果全部为空) .

目前它首先使用 if...else 语句检查哪些参数不为空,然后将它们与列表中的 and 过滤器一起使用。这导致了八个if..else结构。

这是使用所有可能的参数组合重复 8 次的内容:


Predicate<Response> predicate1= e -> StringUtils.isBlank(parameter1) ? false
                    : StringUtils.containsIgnoreCase(e.getter(), parameter1);

if (!StringUtils.isBlank(parameter1) && !StringUtils.isBlank(parameter2)
                    && !StringUtils.isBlank(parameter3)) {
                return response.stream()
                        .filter((predicate1.or(predicate2)).and(predicate3).and(predicate4))
                        .collect(Collectors.toList());
            }

在 Java 8 中是否有更好的方法来执行此操作?像这样重复似乎是一种浪费,但我不确定 Java 中是否有更好的功能来可靠地执行此操作。

PS: parameter1 可以是ID 也可以是位置文本。它用于谓词 1 和 2。

如果我理解正确,当参数不存在时,谓词为真。

所以你会:

Predicate<Response> predicate1= e -> StringUtils.isBlank(parameter1) ? true
                : StringUtils.containsIgnoreCase(e.getter(), parameter1);
Predicate<Response> predicate2= e -> StringUtils.isBlank(parameter2) ? true
                    : StringUtils.containsIgnoreCase(e.getter(), parameter2);
Predicate<Response> predicate3= e -> StringUtils.isBlank(parameter3) ? true
                    : StringUtils.containsIgnoreCase(e.getter(), parameter3);
Predicate<Response> predicate4= e -> StringUtils.isBlank(parameter4) ? true
                    : StringUtils.containsIgnoreCase(e.getter(), parameter4);

然后只有一个过滤器与每个谓词:

return response.stream()
                    .filter(predicate1.and(predicate2).and(predicate3).and(predicate4))
                    .collect(Collectors.toList());

关于你的parameter1在两个谓词中使用,把你的predicate1.or(predicate2)作为一个谓词,并保持上面的逻辑。

predicate12 = predicate1.or(predicate2);
return response.stream()
                    .filter(predicate12.and(predicate3).and(predicate4))
                    .collect(Collectors.toList());