【问题标题】:Java applying filters on nested arrays?Java在嵌套数组上应用过滤器?
【发布时间】:2020-12-06 17:55:29
【问题描述】:

我是一名初级开发人员,目前在一家初创公司实习,我继承了其他开发人员的工作,也是实习生,我正在开发一个网络应用程序。 后端是 Java 的,两周前开始实习之前我从未见过 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 和其他地方,我真的无法找到解决办法。

【问题讨论】:

    标签: java arrays list sorting filter


    【解决方案1】:

    看看这个:

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

    在 lambda 内部,e.languagesRefLanguages[]。您可以通过索引访问任何单个元素,然后使用字段name,例如e.languages[0].name。所以你可以写一个循环来检查你的东西。你也可以使用stream api,例如用Arrays.stream(e.languages).map(l -&gt; l.name).noneMatch("italian"::equals)替换!Arrays.asList(e.languages).contains("italian")

    但您的代码似乎在说,如果filters.languages 不为空,那么只保留会说所有语言的专家。

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

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

    【讨论】:

    • 您好,谢谢您的回答!所以我的代码说:“如果专家不会说 X 语言,则将其从列表中删除”。出于某种原因,我无法让languages.stream() 工作,但我设法找到了这个解决方案:if (filters.languages.contains("french")) { experts.removeIf(e -&gt; !Stream.of(e.languages).anyMatch(x -&gt; x.name.contains("french"))); } 所以非常感谢我让我这样工作!
    • 嗯好的。 !stream.anyMatch(...) 可以替换为 stream.noneMatch(...) 虽然
    • 嘿,我知道已经过去了几个星期,但为了将来参考,我回顾了您的回复,并使用您的解决方案让它工作(所以使用流>地图>收集>包含所有)。所以再次感谢!
    猜你喜欢
    • 2020-02-25
    • 2017-01-28
    • 2019-07-19
    • 1970-01-01
    • 2022-08-19
    • 2021-10-24
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多