调整java流的过滤器
我正在开发一个可以使用许多参数进行过滤的过滤函数,为此我使用了Java Streams。这就是我的代码:调整java流的过滤器,java,java-8,java-stream,Java,Java 8,Java Stream,我正在开发一个可以使用许多参数进行过滤的过滤函数,为此我使用了Java Streams。这就是我的代码: public void filter(String cours,String prof,String salle,String group) { this.appointments().addAll(getTimeTable().getCreneauxsList().stream() .filter(e->e.getProf().equalsIgnoreCas
public void filter(String cours,String prof,String salle,String group) {
this.appointments().addAll(getTimeTable().getCreneauxsList().stream()
.filter(e->e.getProf().equalsIgnoreCase(prof) )
.filter(e->e.getCours().equalsIgnoreCase(cours) )
.filter(e->e.getSalle().equalsIgnoreCase(salle) )
.filter(e->e.getGroup().equalsIgnoreCase(group) )
.collect(Collectors.toList()));
}
我想看看cours、salle、prof、group的一个或多个参数是否为null或其trim()=“”,不值得使用它进行过滤,因为结果不是我期望的结果
但是我不知道怎么做。您可以创建一个方法,在筛选过程中处理null或空字符串,如下所示:
public static boolean compareNullableString(String str, String filterStr) {
return (filterStr == null || filterStr.trim().equals("")) ? true : filterStr.equalsIgnoreCase(str);
}
然后修改您的代码,如:
this.appointments().addAll(getTimeTable().getCreneauxsList().stream()
.filter(e->compareNullableString(e.getProf,prof) )
.filter(e->compareNullableString(e.getCours,cours))
.filter(e->compareNullableString(e.getSalle,salle) )
.filter(e->compareNullableString(e.getGroup,group) )
.collect(Collectors.toList()));
您可以使用番石榴:
boolean isNullOrEmpty = Strings.isNullOrEmpty(e.getProf());
或者有一组来自apache commons的方法:
,
这可能有用:
如果您的案例不是空的
正是您要寻找的:
BiPredicate<String, String> myPredicate = (field, eqString) ->
StringUtils.isNotBlank(field) && field.equalsIgnoreCase(eqString);
...
.filter(e -> myPredicate.test(e.getProf(), prof))
.filter(e -> myPredicate.test(e.getCours(), cours))
.filter(e -> myPredicate.test(e.getSalle(), salle))
.filter(e -> myPredicate.test(e.getGroup(), group))
...
BiPredicate myPredicate=(字段,eqString)->
StringUtils.isNotBlank(字段)和&field.equalsIgnoreCase(eqString);
...
.filter(e->myPredicate.test(e.getProf(),prof))
.filter(e->myPredicate.test(e.getCours(),cours))
.filter(e->myPredicate.test(e.getSalle(),salle))
.filter(e->myPredicate.test(e.getGroup(),group))
...
答案可以改进
方法compareNullableString
可以是原样。您可以不用在forEach
中创建列表和添加元素。还可以将筛选提取到谓词
List appoints=this.appoints();
Stream filterStream=流(
e->compareNullableString(e.getProf,prof),
e->compareNullableString(e.getCours,cours),
e->compareNullableString(e.getSalle,salle),
e->compareNullableString(e.getGroup,group)
);
Predicate filter=filterStream.reduce(Predicate::and).orElse(x->false);
getTimeTable().getCreneauxsList().stream()
.过滤器(过滤器)
.forEach(任命::添加);
您希望得到什么结果?在我的集合中,有些字段为null,因此如果其中一个参数为null,我会得到这些字段,但我想知道参数是否为null或其trim()=“因此没有类似于e->StringUtils.isBlank(prof)| e.getProf().equalsIgnoreCase(prof)
so,您想获得字段为null或空字符串的对象列表否,仅当条件不为空时才应用的筛选器可能只是我,但return filterStr==null | | | filterStr.trim().isEmpty()| | filterStr.equalsIgnoreCase(str)代码>似乎更多readable@ernest_k你是对的。这是个好建议。这将使声明简短易读。谢谢