使用lambda表达式更新嵌套列表:Java 8

时间:2017-11-07 08:36:29

标签: java list lambda java-8

我想使用streams api更新另一个列表中的对象列表。

我的library(dplyr) df %>% group_by(ID) %>% arrange(STUDY_ID, .by_group = TRUE) %>% filter_at(vars(diseased_vessel:left_circumflex), any_vars(!is.na(first(.)) & is.na(last(.)))) #> # A tibble: 4 x 5 #> # Groups: ID [2] #> STUDY_ID ID diseased_vessel left_main_stenosis left_circumflex #> <int> <int> <int> <int> <int> #> 1 1526817 1 2 NA 40 #> 2 1527547 1 NA NA 100 #> 3 1554100 4 1 40 100 #> 4 1554229 4 3 NA NA List<User> users。我想更新匹配userID和相应filterName的元素,并将Filter对象作为参数。地图不允许我这样做。

我尝试过以下操作,但地图似乎不允许映射多个元素。

List<Filter> filters

可用于执行内部public void update(String userID, Filter filter) { users.stream() .filter(element -> element.getUserId().equals(userID) && element.getFilters().stream().filter(f -> f.getName().equals(filter.getName())).findAny().isPresent()) .forEach(x -> { x.getFilters().stream().map(s -> { s.setCreatedOn(filter.getCreatedOn()); s.setDescription(filter.getDescription()); s.setEnabled(filter.isEnabled()); s.setFilterValue(filter.getFilterValue()); s.setReadOnly(filter.isReadOnly()); s.setModifiedOn(filter.getModifiedOn()); s.setName(filter.getName()); s.setType(filter.getType()); s.setValid(filter.isValid()); s.setEncrypted(filter.isEncrypted()); }); }); }

更新的方法是什么

1 个答案:

答案 0 :(得分:5)

如果您将map替换为forEach中的x.getFilters().stream().map(,原始代码就可以使用,但我建议您选择更好的替代方案。

生成应更新的所有Stream<Filter>的平展Filter,然后对其进行更新:

public void update(String userID, Filter filter) {
    users.stream()
         .filter(element -> element.getUserId().equals(userID)) // get relevant user[s]
         .flatMap(element -> element.getFilters().stream()) // get all filters of relevant 
                                                            // user[s]
         .filter(f -> f.getName().equals(filter.getName())) // keep only relevant filters
         .forEach (f -> { // run your update on all the relevant filters
              f.setCreatedOn(filter.getCreatedOn());
              f.setDescription(filter.getDescription());
              f.setEnabled(filter.isEnabled());
              f.setFilterValue(filter.getFilterValue());
              f.setReadOnly(filter.isReadOnly());
              f.setModifiedOn(filter.getModifiedOn());
              // f.setName(filter.getName()); can be removed, as commented by markusk
              f.setType(filter.getType());
              f.setValid(filter.isValid());
              f.setEncrypted(filter.isEncrypted());
            });
}