252

->Listから単純な Java を「変換」する方法を知っています。YZ

List<String> x;
List<Integer> y = x.stream()
        .map(s -> Integer.parseInt(s))
        .collect(Collectors.toList());

ここで、基本的にマップと同じことをしたいと思います。つまり、次のようになります。

INPUT:
{
  "key1" -> "41",    // "41" and "42"
  "key2" -> "42"      // are Strings
}

OUTPUT:
{
  "key1" -> 41,      // 41 and 42
  "key2" -> 42       // are Integers
}

String解決策は->に限定されるべきではありませんInteger。上記のList例のように、任意のメソッド (またはコンストラクター) を呼び出したいと思います。

4

9 に答える 9

448
Map<String, String> x;
Map<String, Integer> y =
    x.entrySet().stream()
        .collect(Collectors.toMap(
            e -> e.getKey(),
            e -> Integer.parseInt(e.getValue())
        ));

これは、リスト コードほど適切ではありません。Map.Entry呼び出しで新しいs を構築することはできないmap()ため、作業は呼び出しに混在していcollect()ます。

于 2014-09-18T02:21:17.793 に答える
17

そのような一般的な解決策

public static <X, Y, Z> Map<X, Z> transform(Map<X, Y> input,
        Function<Y, Z> function) {
    return input
            .entrySet()
            .stream()
            .collect(
                    Collectors.toMap((entry) -> entry.getKey(),
                            (entry) -> function.apply(entry.getValue())));
}

Map<String, String> input = new HashMap<String, String>();
input.put("string1", "42");
input.put("string2", "41");
Map<String, Integer> output = transform(input,
            (val) -> Integer.parseInt(val));
于 2014-09-18T02:23:51.753 に答える
11

絶対に 100% 機能的で流暢でなければならないのでしょうか? そうでない場合は、これはどうですか。これは可能な限り短いものです。

Map<String, Integer> output = new HashMap<>();
input.forEach((k, v) -> output.put(k, Integer.valueOf(v));

(ストリームと副作用を組み合わせることの恥と罪悪感に耐えることができる場合)

于 2016-01-06T21:38:59.203 に答える
4

学習目的で常に存在する代替手段は、Collector.of() を介してカスタム コレクターを構築することですが、ここでの toMap() JDK コレクターは簡潔です (+1 here ) 。

Map<String,Integer> newMap = givenMap.
                entrySet().
                stream().collect(Collector.of
               ( ()-> new HashMap<String,Integer>(),
                       (mutableMap,entryItem)-> mutableMap.put(entryItem.getKey(),Integer.parseInt(entryItem.getValue())),
                       (map1,map2)->{ map1.putAll(map2); return map1;}
               ));
于 2016-06-26T02:39:18.847 に答える
3

サードパーティのライブラリを使用してもかまわない場合、私のcyclops-react libには、 Mapを含むすべてのJDK Collectionタイプの拡張機能があります。「マップ」演算子を使用してマップを直接変換するだけです (デフォルトでは、マップはマップ内の値に作用します)。

   MapX<String,Integer> y = MapX.fromMap(HashMaps.of("hello","1"))
                                .map(Integer::parseInt);

bimap を使用して、キーと値を同時に変換できます

  MapX<String,Integer> y = MapX.fromMap(HashMaps.of("hello","1"))
                               .bimap(this::newKey,Integer::parseInt);
于 2016-02-23T11:58:59.737 に答える