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

wan*_*onk 5 java lambda list java-8

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

我有一个List<User> users具有List<Filter> filters.我想更新匹配userID和相应filterName的元素,并将Filter对象作为参数.地图不允许我这样做.

我尝试过以下但是地图似乎不允许映射多个元素.

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());
                });
        });
    }
Run Code Online (Sandbox Code Playgroud)

什么是可用于执行内部更新的方法 List<Filter>

Era*_*ran 5

如果你mapforEachin 替换你的原始代码可以工作x.getFilters().stream().map(,但我建议一个更好的选择.

生成应更新Stream<Filter>的所有Filters的单元,然后对它们运行更新:

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());
            });
}
Run Code Online (Sandbox Code Playgroud)

  • `x.setName(filter.getName())`应该是不必要的,因为你已经确定前面的过滤器中的名称是相同的. (3认同)