【发布时间】:2017-11-07 05:53:14
【问题描述】:
我有一个List<User> users。我想根据两个条件过滤列表。
- 匹配用户 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; } }
这是方法签名
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 -> f.getFilterName().equals(filterName))更改为element.getFilters().stream().filter(f -> f.filterName.equals(FilterName)).findAny().isPresent()