gpt4 book ai didi

java - 如何使 Map 可选(无论其每个可选值是否存在)

转载 作者:行者123 更新时间:2023-12-02 11:02:23 25 4
gpt4 key购买 nike

我有一个包含许多可选值的 map :

Map<MyCoolKey, Optional<MyCoolValue>>

我想把这张 map 变成 Optional<Map<>> :

Optional<Map<MyCoolKey, MyCoolValue>>
  • 如果每 Optional<MyCoolValue>存在:Optional<Map<>>应该在场。
  • 如果 Optional<MyCoolValue>不存在:Optional<Map<>>应该不存在。

我尝试了这个,我怀疑我的代码可以工作,但是有点啰嗦:

final Map<MyCoolKey, Optional<MyCoolValue>> myCoolMap;
final Optional<Map<MyCoolKey, MyCoolValue>> optionalMap = myCoolMap
.entrySet()
.stream()
.map(e -> e
.getValue()
.flatMap(value -> Optional.<Map.Entry<MyCoolKey, MyCoolValue>>of(
new AbstractMap.SimpleEntry<>(
e.getKey(),
value
)
))
)
.collect(
() -> Optional.<Map<MyCoolKey, MyCoolValue>>of(new HashMap<>()),
(optAcc, optEntry) -> optAcc.flatMap(
acc -> optEntry.map(
entry -> {
acc.put(entry.getKey(), entry.getValue());
return acc;
})
),
(optAcc1, optAcc2) -> optAcc1.flatMap(
acc1 -> optAcc2.map(
acc2 -> {
acc1.putAll(acc2);
return acc1;
}
)
)
);

有更好的方法吗? “更好”意味着正确、性能、美观。我更喜欢一个可以在一个流中完成整个操作的答案。

最佳答案

这是纯流解决方案的示例(没有 if 和三元运算符)

final Map<MyCoolKey, Optional<MyCoolValue>> myCoolMap = new HashMap<>();

Optional<Map<MyCoolKey, MyCoolValue>> output = Optional.of(myCoolMap)
.filter(map -> map.values().stream().allMatch(Optional::isPresent))
.map(map -> map
.entrySet()
.stream()
.collect(toMap(
Map.Entry::getKey,
entry -> entry.getValue().get()
))
);

这并不太复杂 - 过滤和映射就是流的用途!

关于java - 如何使 Map 可选(无论其每个可选值是否存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51764884/

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