【问题标题】:Filtering nested lists using lambda使用 lambda 过滤嵌套列表
【发布时间】:2017-11-07 05:53:14
【问题描述】:

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

  1. 匹配用户 ID
  2. 匹配过滤器名称

    公共类用户实现实体{

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

【问题讨论】:

  • 在 filterName 流上使用anymatch 怎么样?
  • 如果您想检查过滤器列表中是否存在filterName。您可以简单地将element.getFilters().stream().filter(f -&gt; f.getFilterName().equals(filterName)) 更改为element.getFilters().stream().filter(f -&gt; f.filterName.equals(FilterName)).findAny().isPresent()

标签: java list lambda java-8


【解决方案1】:

你应该改变

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

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

这将返回 boolean true 对于指定谓词的任何匹配,在您的情况下与 filter 中指定的相同。

【讨论】:

    【解决方案2】:

    我认为它可能对您有所帮助,第二个条件获取所有过滤器的流并找到该过滤器中存在的过滤器名称是列表,如果是则返回 true 否则返回 false。

    users.stream()
            .filter(element -> element.getUserId().equals(userId)
                && element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent())
            .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多