使用lambda函数过滤嵌套列表

4

我有一个 List<User> users,我想根据两个条件对列表进行过滤。

  1. Matching the UserID
  2. 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());

3
在过滤器名称流上使用anymatch怎么样? - Adiel Loinger
如果您想检查“filterName”是否存在于过滤器列表中,您可以简单地将element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))更改为element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent() - Sandeep Kokate
2个回答

3

您需要更改

element.getFilters().stream().filter(f -> f.getFilterName().equals(filterName))

to

element.getFilters().stream().anyMatch(f -> f.getFilterName().equals(filterName))

在你的情况下,filter 中指定的谓词匹配任何与指定相同的结果都会返回布尔值 true。


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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接