[英]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.