我有一个 List<User> users
,我想根据两个条件对列表进行过滤。
- Matching the UserID
Matching the FilterName
public class User implements Entity {
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转换为boolean
尝试了Adiel Loinger的建议。它起作用了。
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());
anymatch
怎么样? - Adiel Loingerelement.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))
更改为element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent()
。 - Sandeep Kokate