在 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());
有一项服务接受四个参数,这些参数用于从缓存存储中过滤数据,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());