171

Java 8 を見始めたばかりで、ラムダを試すために、最近書​​いた非常に単純なものを書き直そうと思いました。文字列から列へのマップを別の文字列から列へのマップに変換する必要があります。ここで、新しいマップの列は最初のマップの列の防御的なコピーです。列にはコピー コンストラクターがあります。私がこれまでに得た最も近いものは次のとおりです。

    Map<String, Column> newColumnMap= new HashMap<>();
    originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));

しかし、もっと良い方法があるに違いないと確信しており、アドバイスをいただければ幸いです。

4

7 に答える 7

13

すべてのエントリを新しいマップに再挿入しない方法HashMap.cloneは、内部で再ハッシュも実行するため、最速ではないはずです。

Map<String, Column> newColumnMap = originalColumnMap.clone();
newColumnMap.replaceAll((s, c) -> new Column(c));
于 2014-03-30T11:54:28.003 に答える
4

何らかの変換を行う必要がある場合に備えて、キーと値に同時にアクセスできる別の方法を次に示します。

Map<String, Integer> pointsByName = new HashMap<>();
Map<String, Integer> maxPointsByName = new HashMap<>();

Map<String, Double> gradesByName = pointsByName.entrySet().stream()
        .map(entry -> new AbstractMap.SimpleImmutableEntry<>(
                entry.getKey(), ((double) entry.getValue() /
                        maxPointsByName.get(entry.getKey())) * 100d))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
于 2017-10-04T06:18:28.063 に答える
1

サードパーティのライブラリを使用してもかまわない場合、私のcyclops-react libには、 Mapを含むすべてのJDK Collectionタイプの拡張機能があります。map または bimap メソッドを直接使用して、Map を変換できます。MapX は既存の Map から構築できます。

  MapX<String, Column> y = MapX.fromMap(orgColumnMap)
                               .map(c->new Column(c.getValue());

キーも変更したい場合は、次のように記述できます

  MapX<String, Column> y = MapX.fromMap(orgColumnMap)
                               .bimap(this::newKey,c->new Column(c.getValue());

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

MapX は Map を拡張するため、生成されたマップは次のように定義することもできます。

  Map<String, Column> y
于 2016-02-24T16:13:16.240 に答える