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>
如果你map用forEachin 替换你的原始代码可以工作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)