我想使用streams api更新另一个列表中的对象列表。
我的library(dplyr)
df %>%
group_by(ID) %>%
arrange(STUDY_ID, .by_group = TRUE) %>%
filter_at(vars(diseased_vessel:left_circumflex),
any_vars(!is.na(first(.)) & is.na(last(.))))
#> # A tibble: 4 x 5
#> # Groups: ID [2]
#> STUDY_ID ID diseased_vessel left_main_stenosis left_circumflex
#> <int> <int> <int> <int> <int>
#> 1 1526817 1 2 NA 40
#> 2 1527547 1 NA NA 100
#> 3 1554100 4 1 40 100
#> 4 1554229 4 3 NA NA
有List<User> users
。我想更新匹配userID和相应filterName的元素,并将Filter对象作为参数。地图不允许我这样做。
我尝试过以下操作,但地图似乎不允许映射多个元素。
List<Filter> filters
可用于执行内部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());
});
});
}
答案 0 :(得分:5)
如果您将map
替换为forEach
中的x.getFilters().stream().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());
});
}