Birchlabs:
私は多くのオプションの値を使用して地図を持っています。
Map<MyCoolKey, Optional<MyCoolValue>>
私はにこの地図を変革したいと思います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;
}
)
)
);
これを行うには良い方法はありますか?「より良い」との正確性、パフォーマンス、美しさ。私は1つのストリームに全体の動作を行うことができます答えを好むだろう。
ダノン:
ここでは(ない純粋なストリーム・ソリューションの一例だif
sおよび三項演算子)
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()
))
);
これは、過複雑ではありません - フィルタリングとマッピングはストリームがあるため何です!