我是一名初学者开发人员,目前在初创公司从事实习工作,我继承了其他开发人员(包括实习生)的工作,并且正在开发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和其他地方之后,我真的无法找到解决方案。
答案 0 :(得分:0)
看这里:
if (filters.languages.contains("english")) {
experts.removeIf(e -> !Arrays.asList(e.languages).contains("english"));
}
在lambda中,e.languages
是RefLanguages[]
。您可以按索引访问任何单个元素,然后使用字段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));