Java 使用lambda筛选嵌套列表
我有一个Java 使用lambda筛选嵌套列表,java,list,lambda,java-8,Java,List,Lambda,Java 8,我有一个用户列表。我想根据两个条件筛选列表 匹配用户ID 匹配过滤器名称 公共类用户实现实体{ public User() { } private String userName; private String userId; private List<Filter> filters; public String getUserName() { return userName; } public v
用户列表
。我想根据两个条件筛选列表
public User() {
}
private String userName;
private String userId;
private List<Filter> filters;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public List<Filter> getFilters() {
return filters;
}
public void setFilters(List<Filter> filters) {
this.filters = filters;
}
}
无论哪种方式,我都会得到下面的错误
类型不匹配:无法从流转换为布尔值
尝试了Adiel Loingers的建议,成功了
java.util.function.Predicate<Filter> con = e -> e.getName().equals(predicate.getFilterName());
result = users.stream().filter(p -> p.getUserId().equals(predicate.getUserID()) && p.getFilters().stream().anyMatch(con)).collect(Collectors.toList());
java.util.function.Predicate con=e->e.getName().equals(Predicate.getFilterName());
结果=users.stream().filter(p->p.getUserId().equals(predicate.getUserId())和&p.getFilters().stream().anyMatch(con)).collect(Collectors.toList());
您应该更改
element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))
到
对于指定的谓词的任何匹配,它将返回
布尔值
true,该谓词与在您的案例中的过滤器
中指定的谓词相同。我认为它可能会帮助您,第二个条件获取所有过滤器的流,并找到过滤器列表中存在的过滤器名称,如果是,则返回true,否则返回false
users.stream()
.filter(element -> element.getUserId().equals(userId)
&& element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent())
.collect(Collectors.toList());
在filterName流上使用
anymatch
怎么样?如果要检查过滤器列表中是否存在filterName
,只需将element.getFilterName().stream().Filter(f->f.getFilterName().equals(filterName))
更改为element.getFilterName().stream().Filter(f->.f.filterName.equals(filterName)).findAny().isPresent()
element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))
element.getFilters().stream().anyMatch(f -> f.getFilterName().equals(filterName))
users.stream()
.filter(element -> element.getUserId().equals(userId)
&& element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent())
.collect(Collectors.toList());