簡體   English   中英

使用Lambda表達式更新嵌套列表:Java 8

[英]Updating nested list using lambda expression : Java 8

我想使用流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>更新的方法是什么

如果在x.getFilters().stream().map(中用forEach替換map ,則原始代碼可以工作,但我建議使用更好的方法。

為所有應更新的Filter生成一個平面Stream<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());
            });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM