使用lambda过滤嵌套列表

时间:2017-11-07 05:53:14

标签: java list lambda java-8

我有List<User> users。我想根据两个条件筛选列表。

  1. 匹配UserID
  2. 匹配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;
        }
    
    }
    
  3. 这是方法签名

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

2 个答案:

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