调整java流的过滤器

调整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

我正在开发一个可以使用许多参数进行过滤的过滤函数,为此我使用了Java Streams。这就是我的代码:

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你是对的。这是个好建议。这将使声明简短易读。谢谢