当前位置: 首页 > 知识库问答 >
问题:

如何将 if-else if 将具有多个筛选条件的块代码链接为具有空校验的单个筛选条件?

南门朗
2023-03-14

我确实有一个员工课程

我尝试了以下方法来进行过滤部分,但如果链接正在发生,则有多个if-else。是否有更好的方法将这种链接减少为单个谓词,类似于动态过滤中所做的事情。我使用的链接代码如下:

员工类

public class Employee{
    private String fName;
    private String lName;
    private String type;

    //getters & setters

}

If-else if链接块:

public List<Employee> retrieveEmployees(String searchToken, String fName, String lName, String type){
    //this will retrieve all the available employees 
    List<Employee> employees = getEmployees(); 
    List<Employee> filteredEmployees= new ArrayList<>();

    //perform filtering on the basis of accepted params
    if(searchToken !=null){
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getFName().equalsIgnoreCase(searchToken) && emp.getLName().equalsIgnoreCase(searchToken))
        .collect(Collectors.toList());

    }
    else if (fName != null && lName != null && type != null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getFName().equalsIgnoreCase(fName) && emp.getLName().equalsIgnoreCase(lName) && emp.getType().equalsIgnoreCase(type))
        .collect(Collectors.toList());
    } else if (type != null && fname != null && lname == null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getFName().equalsIgnoreCase(fName) && emp.getType().equalsIgnoreCase(type))
        .collect(Collectors.toList());
    } else if (fname != null && lname != null && type == null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getFName().equalsIgnoreCase(fName) && emp.getLName().equalsIgnoreCase(lName))
        .collect(Collectors.toList());
    } else if (lname != null && type != null && fname == null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getLName().equalsIgnoreCase(lName) && emp.getType().equalsIgnoreCase(type))
        .collect(Collectors.toList());
    } else if (fname != null && lname == null && type == null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getFName().equalsIgnoreCase(fName))
        .collect(Collectors.toList());
    } else if (lname != null && fname == null && type == null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getLName().equalsIgnoreCase(lName))
        .collect(Collectors.toList());
    } else if (type != null && fname == null && lname == null) {
        filteredEmployees=employees
        .stream()
        .filter(emp-> emp.getType().equalsIgnoreCase(type))
        .collect(Collectors.toList());
    } else {
        filteredEmployees=getEmployees();
    }


    return filteredEmployees;
}

我尝试过类似的方法,但是失败了,因为谓词本身只是执行< code >或/和操作,它不满足我在< code>if-else if块中所做的操作:

List<Predicate<Employee>> predicates=Arrays.asList(
            e -> e.getFName().equalsIgnoreCase(fName),
            e -> e.getLName().equalsIgnoreCase(lName),
            e -> e.getType().equals(type)
    );

Predicate<Employee> compositePredicate = predicates
    .stream()
    .reduce(w -> true, Predicate::or); //tried with 'and' as well

filteredEmployees= employees
    .stream()
    .filter(compositePredicate)
    .collect(Collectors.toList());

我缺少什么?可以应用什么有效的流谓词链方法?

共有1个答案

阎宝
2023-03-14

您可以有一个类SearchFilter,它将包含您的所有过滤器字段,例如search chTokenfname等。和另一个条件,例如:

class Condition {
    private Predicate<SearchFilter> searchFilterPredicate;
    private Function<SearchFilter, Predicate<Employee>> function;
}

然后,您可以定义一个包含所有条件的静态不可变列表:

List<Condition> conditions = Arrays.asList(
    new Condition(sf -> sf.getSearchToken() != null,
                  sf -> emp -> emp.getFName().equalsIgnoreCase(sf.getSearchToken()) && emp.getLName().equalsIgnoreCase(sf.getSearchToken())),
    new Condition(sf -> ObjectUtils.allNotNull(sf.getFname(), sf.getLname(), sf.getType()),
                  sf -> emp-> emp.getFName().equalsIgnoreCase(sf.getFname()) && emp.getLName().equalsIgnoreCase(sf.getLname()) && emp.getType().equalsIgnoreCase(sf.getType()))
    //...
);

最后是< code>retrieveEmployees方法

public List<Employee> retrieveEmployees(String searchToken, String fname, String lname, String type){
    List<Employee> employees = getEmployees();
    SearchFilter searchFilter = new SearchFilter(searchToken, fname, lname, type);

    Optional<Predicate<Employee>> firstCondition = conditions.stream()
            .filter(condition -> condition.getSearchFilterPredicate().test(searchFilter))
            .findFirst()
            .map(condition -> condition.getFunction().apply(searchFilter));

    return firstCondition.map(employeePredicate -> employees.stream()
                .filter(employeePredicate)
                .collect(Collectors.toList()))
            .orElse(employees);
}

另一种解决方案可能是检查每个过滤器字段并将其添加到谓词中

List<Employee> retrieveEmployees(String searchToken, String fname, String lname, String type){
    List<Employee> employees = getEmployees();
    if(searchToken != null) {
        return employees
                .stream()
                .filter(emp -> emp.getFName().equalsIgnoreCase(searchToken) && emp.getLName().equalsIgnoreCase(searchToken))
                .collect(Collectors.toList());

    }
    Predicate<Employee> predicate = employee -> true;

    if(type != null) {
        predicate = predicate.and(emp -> emp.getType().equalsIgnoreCase(type));
    }
    if(lname != null) {
        predicate = predicate.and(emp -> emp.getLName().equalsIgnoreCase(lname));
    }
    if(fname != null) {
        predicate = predicate.and(emp -> emp.getFName().equalsIgnoreCase(fname));
    }

    return employees.stream()
             .filter(predicate)
             .collect(Collectors.toList());
}
 类似资料:
  • 问题内容: 我有2张桌子: 表: 表: 现在,我想获取所有位置并过滤两个属性: 我正在尝试构造一些查询,如下所示: …但是仍然无法得到我所需要的。 问题答案: 经过几个小时的合并和尝试,我终于做到了: 我太接近了,因此将所有过滤条件都移至。

  • 我已经了解了如何使用phpunit运行单一测试方法? 我在应用过滤器方面没有问题,例如,,但是我希望能够在一个命令行中检查许多测试文件,例如,,但这不起作用。 有没有办法从命令行执行此操作?

  • 问题内容: 我想知道是否可能有这样的事情: 知道项目是通过请求接收的JSON容器,因此这就是为什么我使用键值方法的原因。 谢谢 我之所以问是因为我尝试使用Google进行谷歌搜索,但是我唯一能得到的结果是,但是我必须使用。 问题答案: 你当然可以。就像是: HTML JS 演示小提琴

  • 我有3个表:User、Role和具有Role\u id和User\u id的透视表RoleUser。 对于关系在我的模型我这样做: 榜样: 用户模型: 我为filter by one角色做了这项工作,效果很好: 但是现在我需要通过许多角色来过滤我的用户。 我将从我的前端发送一个数组,其中包含角色的id。 事实上,我可以得到如下角色 但我不知道如何才能获得具有此角色的用户。

  • 问题内容: 我有一个变量。 我想呼应,如果等于任何下列值,,,,或。有没有办法通过像?? 这样的单个语句来做到这一点? 问题答案: 我认为,使用“ Or”代替“ And”会有所帮助

  • 本文向大家介绍jQuery多条件筛选如何实现,包括了jQuery多条件筛选如何实现的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery实现多条件筛选特效。分享给大家供大家参考。具体如下: 我们在电商平台购买商品时,在商品列表页根据品牌、款式、价格范围等条件进行筛选查询,当点击某个条件时,在页面上会显示用户所选择的条件集合,并且将对应的符合条件的商品信息展示出来。那么今天我们使用jQ