我有List<User> users
。我想根据两个条件筛选列表。
匹配FilterName
public class User实现实体{
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;
}
}
这是方法签名
List<User> users = getUsersList();
public List<User> query(String userID,String filterName){
users.stream().filter(element -> element.getUserID().equals(userID) && element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))).collect(Collectors.toList());
}
上述方法不起作用,因为我基于元素和流进行过滤。任何人都可以帮助我使用正确的方法来过滤列表和嵌套列表。
我也试过这种方式
users.stream().filter(e -> e.getUserId().equals(predicate.getUserID())).collect(Collectors.toList()).stream().filter(f -> f.getFilters().stream().filter(fe -> fe.getName().equals(predicate.getFilterName()))).collect(Collectors.toList());
无论哪种方式我都会收到以下错误
类型不匹配:无法从Stream转换为布尔值
尝试了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());
答案 0 :(得分:2)
你应该改变
element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))
到
element.getFilters().stream().anyMatch(f -> f.getFilterName().equals(filterName))
对于指定谓词的任何匹配,将返回boolean
true,这与您案例中filter
中指定的相同。
答案 1 :(得分:1)
我认为它可能有所帮助,第二个条件获取所有过滤器的流,并在该过滤器列表中找到您的过滤器名称,如果是,则返回true,否则为false。
users.stream()
.filter(element -> element.getUserId().equals(userId)
&& element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent())
.collect(Collectors.toList());