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

我有一个
用户列表
。我想根据两个条件筛选列表

  • 匹配用户ID
  • 匹配过滤器名称

    公共类用户实现实体{

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