fbielejec:
私は次のシグネチャを持つメソッドを持っているとしましょう:
Map<String, String> merge (String[][] ... maps)
これは、例えば、マッピングを表す2つの次元のアレイの(可変長)数をとります。
String[][] m1 = new String[][] {
{"k1", "a"},
{"k2", "b"}
};
String[][] m2 = new String[][] {
{"k1", "a"},
{"k2", "b"},
{"k3", "c"}
};
String[][] m3 = new String[][] {
{"k1", "x"},
{"k2", "b"}
};
今、私はマップのいずれか2つをマージすることができ、左から右へ、次のように:
Map<String, String> m1 = Stream.of(map1).collect(Collectors.toMap(k -> k[0], v -> v[1]));
Map<String, String> m2 = Stream.of(map2).collect(Collectors.toMap(k -> k[0], v -> Optional.ofNullable(v[1]).orElse("null")));
m1.forEach((key, value) -> m2.merge(key, value, (v1, v2) -> v1));
しかし、私は通過した後ように、このような配列マップの可変引数の数をマージについてどのように行くことができm1, m2, m3
た結果、上記定義した通りであります:
String[][] m3 = new String[][] {
{"k1", "x"},
{"k2", "b"}
{"k3", "c"}
};
shmosel:
私が正しくあなたの質問を理解してるかどうかは、非常に簡単です。あなたマージ機能を持つだけでflatMapすべてのエントリとマップすることが収集、選択した後の値:
Map<String, String> merge (String[][] ... maps) {
return Arrays.stream(maps)
.flatMap(Arrays::stream)
.collect(Collectors.toMap(a -> a[0], a -> a[1], (a, b) -> b));
}
あなたは配列に戻ってそれを変換したい場合は、行うことができます
String[][] m3 = merge(maps)
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(), e.getValue() })
.toArray(String[][]::new);