web-dev-qa-db-ja.com

Java 8でマップの値をマップする方法?

Map<String, Integer>があるとします。 Map<String, String>を取得する簡単な方法はありますか?

簡単に言うと、私はこれが好きではないということです:

Map<String, String> mapped = new HashMap<>();
for(String key : originalMap.keySet()) {
    mapped.put(key, originalMap.get(key).toString());
}

ただし、次のようなライナーがあります。

Map<String, String> mapped = originalMap.mapValues(v -> v.toString());

しかし、明らかにmapValuesメソッドはありません。

46
siledh

エントリをストリーミングして、新しいマップに収集する必要があります。

Map<String, String> result = map.entrySet().stream()
                  .collect(Collectors.toMap(Entry::getKey, e -> String.valueOf(e.getValue()));
100
assylias

最も簡単な方法は次のとおりです。

Map<String, Integer> map = new HashMap<>();
Map<String, String> mapped = map.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue())));

ここで行うことは:

  1. Stream<Map.Entry<String, Integer>>
  2. 結果のマップで結果を収集します。
    1. エントリをキーにマップします。
    2. エントリを新しい値にマッピングし、String.valueOf

あなたがワンライナーでそれを行うことができない理由は、Mapインターフェイスがそのようなものを提供していないためです。あなたがそれに到達できる最も近いものはmap.replaceAll、しかし、そのメソッドは、型が同じままであることを指示します。

22
skiwi