gpt4 book ai didi

java-8 - Java8 Stream - 在单行中使用过滤器收集 foreach

转载 作者:行者123 更新时间:2023-12-04 09:30:33 24 4
gpt4 key购买 nike

不能在单个语句而不是多个语句中使用 filter()、collect() 和 foreach() 吗?

我有一张 map ,需要根据某些条件进行过滤并为内容设置一些值并返回 map 。我的当前看起来像下面,但我想要在一个语句中所有 3。

map inputMap(包含所有信息)

Map<String, Person> returnMap; 
returnMap = map.entrySet().stream()
.filter(p -> p.getValue().getCourse() == 123)
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

returnMap.entrySet().stream().forEach((entry) -> {
Person person= entry.getValue();
person.setAction("update");
person.setLastUpdatedTime(new Date());
});

这可以转换为,
  Map<String, Person> returnMap; 
returnMap = map.entrySet().stream()
.filter(p -> p.getValue().getCourse() == 123)
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()))
.forEach((entry) -> {
Person person= entry.getValue();
person.setAction("update");
person.setLastUpdatedTime(new Date());
});

(此代码不起作用)

最佳答案

坚持一次操作是没有意义的。不管你怎么写,这都是两个操作。

但是你应该考虑的一件事是,有比 entrySet().stream() 更多的方法。处理所有元素:

Map<String, Person> returnMap = map.entrySet().stream()
.filter(p -> p.getValue().getCourse() == 123)
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

returnMap.values().forEach(person -> {
person.setAction("update");
person.setLastUpdatedTime(new Date());
});

如果你仍然坚持让它看起来像一个单一的操作,你可以这样做:
Map<String, Person> returnMap = map.entrySet().stream()
.filter(p -> p.getValue().getCourse() == 123)
.collect(Collectors.collectingAndThen(
Collectors.toMap(p -> p.getKey(), p -> p.getValue()),
tmp -> {
tmp.values().forEach(person -> {
person.setAction("update");
person.setLastUpdatedTime(new Date());
});
return tmp;
})
);

这在语法上是一个单一的语句,但它的作用与前一个变体完全相同。

关于java-8 - Java8 Stream - 在单行中使用过滤器收集 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37711766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com