そのすべてのオプションの値が存在するかどうかに地図オプションにする方法

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つのストリームに全体の動作を行うことができます答えを好むだろう。

ダノン:

ここでは(ない純粋なストリーム・ソリューションの一例だifsおよび三項演算子)

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()
        ))
    );

これは、過複雑ではありません - フィルタリングとマッピングはストリームがあるため何です!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=224118&siteId=1