有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

我尝试了下面的操作,但map似乎不允许映射多个元素

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

可以使用什么方法更新内部List<Filter>


共 (1) 个答案

  1. # 1 楼答案

    如果在x.getFilters().stream().map(中用forEach替换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());
                });
    }