Java对嵌套数组应用过滤器?

时间:2020-08-17 15:02:09

标签: java arrays list sorting filter

我是一名初学者开发人员,目前在初创公司从事实习工作,我继承了其他开发人员(包括实习生)的工作,并且正在开发Web应用程序。 后端是Java,在2周前开始实习之前,我从未见过Java代码,因此有时我在阅读和理解代码时会遇到很多麻烦,在过去的48个小时中,我一直都停留在此上。

我必须创建一个使用多个参数过滤配置文件的功能。这是功能:

// Apply filters on our experts list
private List<UserExpertInfo> applyFilterOnUserExpertInfo(List<UserExpertInfo> experts, FiltersExpertsRequest filters) {

    if (filters.isAvailable != null && filters.isAvailable == true ) {
        experts.removeIf(e -> e.availability == false);
    }
    if (filters.name != null && !filters.name.equals("")) {
        experts.removeIf(e -> !(e.firstName + e.LastName).contains(filters.name));
    }
    if (filters.maximumPrice != null) {
        experts.removeIf(e -> !(filters.maximumPrice.longValue() >= e.wage.longValue()));
    }

    //  /!\ CAREFUL /!\ We can't have a NULL field in DB, or the removeIf function automatically returns NULL and the server sends back an error
    if (filters.minimumRating != null) {
        experts.removeIf(e -> !(filters.minimumRating.longValue() <= e.rating.longValue()));
    }

    // Expertises
    if (filters.fluids != null && filters.fluids == true) {
        experts.removeIf(e -> !e.expertises.fluids);
    }
    if (filters.thermic != null && filters.thermic == true) {
        experts.removeIf(e -> !e.expertises.thermic);
    }
    if (filters.struct != null && filters.struct == true) {
        experts.removeIf(e -> !e.expertises.struct);
    }
    if (filters.electro != null && filters.electro == true) {
        experts.removeIf(e -> !e.expertises.electroMag);
    }
   
    // Areas
    if (filters.aerospace != null && filters.aerospace == true) {
        experts.removeIf(e -> !Arrays.asList(e.areas).contains("AEROSPACE"));
    }
    if (filters.industries != null && filters.industries == true) {
        experts.removeIf(e -> !Arrays.asList(e.areas).contains("INDUSTRIES"));
    }
    if (filters.transport != null && filters.transport == true) {
        experts.removeIf(e -> !Arrays.asList(e.areas).contains("TRANSPORT"));
    }
    if (filters.energy != null && filters.energy == true) {
        experts.removeIf(e -> !Arrays.asList(e.areas).contains("ENERGY"));
    }

    // Languages : TODO
    if (filters.languages != null) {

        if (filters.languages.contains("english")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("english"));
        }
        if (filters.languages.contains("spanish")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("spanish"));
        }
        if (filters.languages.contains("french")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("french"));
        }
        if (filters.languages.contains("german")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("german"));
        }
        if (filters.languages.contains("italian")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("italian"));
        }
        if (filters.languages.contains("dutch")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("dutch"));
        }
    }

    
    // Softwares : TODO 
    
    return experts;
}

所以,一切工作都很好,但是我被困在语言部分。我似乎无法访问“语言”数组中的“名称”字段。如果我误解了Java的工作原理,请再次宽恕我。 以下是此功能所依赖的文件:

package fr.squad.zel.api;

import java.util.UUID;

public class UserExpertInfo {
    public UUID userId;
    public UUID expertId;
    public String title;
    public Number rating;
    public Number wage;
    public boolean availability;
    public UUID photoUrl;
    public String firstName;
    public String LastName;
    public Expertise expertises;
    public String[] areas;
    public RefSoftwares[] softwares;
    public RefLanguages[] languages;
}

package fr.squad.zel.api;

import java.util.UUID;

public class RefLanguages {
    public UUID id;
    public String name;

}

最后,这是我如何获取专家参数(这只是该功能的相关部分):

// Get expert's areas.
        List<String> tempStringList = compoExpertsAreasServiceActions.findNamesByIdExpert(userTemp.getId());
        userExpertTemp.areas = tempStringList.toArray(new String[tempStringList.size()]);

        // Get expert's Softwares. 
        List<RefSoftwares> tempSoftwaresList = compoExpertsSoftwaresService.findAllByExpertId(userTemp.getId());
        userExpertTemp.softwares = tempSoftwaresList.toArray(new RefSoftwares[tempSoftwaresList.size()]);

        // Get expert's Languages.
        List<RefLanguages> tempLanguagesList = this.languageService.findAllByUserId(userTemp.getId());
        userExpertTemp.languages = tempLanguagesList.toArray(new RefLanguages[tempLanguagesList.size()]);

        return userExpertTemp;

过滤器工作正常,我已经全部打印了。但是我无法访问这些语言的名称,我似乎真的无法理解这些对象彼此之间工作的方式,并且在长时间搜索StackOverflow和其他地方之后,我真的无法找到解决方案。

1 个答案:

答案 0 :(得分:0)

看这里:

        if (filters.languages.contains("english")) {
            experts.removeIf(e -> !Arrays.asList(e.languages).contains("english"));
        }

在lambda中,e.languagesRefLanguages[]。您可以按索引访问任何单个元素,然后使用字段name,例如e.languages[0].name。因此,您可以编写一个循环来检查您的事情。您还可以使用流api,例如将!Arrays.asList(e.languages).contains("italian")替换为Arrays.stream(e.languages).map(l -> l.name).noneMatch("italian"::equals)

但是您的代码似乎在说,如果filters.languages不为null,则仅保留使用所有语言的专家。

因此,您可以将每种语言名称放入一个集合并测试是否包含,而不用对每种语言重复检查,

experts.removeIf(e -> !Arrays.stream(e.languages)
                             .map(l -> l.name)
                             .collect(Collectors.toSet())
                             .containsAll(filters.languages));