2015-11-16 4 views
5

私は2つのマップ最初のマップに要素がない場合、mergeMapsは機能しませんか?

 private void mergeMaps(HashMap<String, FailureExample> current, 
          HashMap<String, FailureExample> other) { 

     current.forEach((k, v) -> other.merge(k, v, 
       (v1, v2) -> { 
        FailureExample answer = new FailureExample(); 

        addFromListWithSizeLimit(v1, answer); 
        addFromListWithSizeLimit(v2, answer); 

//     answer.requests.addAll(v1.requests); 
//     answer.requests.addAll(v2.requests); 
        return answer; 
       })); 
    } 

をマージしようとしたが、現在は0の要素を持っている場合、ラムダは実行されません。

マージできない場合は、マージで結合しないでください。

私がしたい:あなたは空のコレクションにforEachを呼び出す

map1{} ; map2{<a,<a1>>} returns map3{<a,<a1>>} 

map1{<a,<b1>>} ; map2{<a,<a1>>} returns map3{<a,<a1, b1>>} 
+0

あなたは第二のマップをマージしようとしていることを忘れて、あなたは空のリストに 'forEach'を呼び出す想像:何回だろうラムダは実行されますか? –

+0

'other'マップを修正していることに加えて、' map2'と 'map3'は同じですが、コードはあなたが記述したものを正確に行います。なぜあなたは何か違うことを期待しているのか、何のために何を期待するのかははっきりしない両方のマップに別のキーがある場合、ラムダ式も実行されません。 – Holger

答えて

1

場合は、ラムダを実行するには何も明らかにありません。 otherに要素を追加し、よりもむしろcurrentますしかし

if (current.isEmpty()) { 
    HashMap<String, FailureExample> tmp = current; 
    current = other; 
    other = tmp; 
} 

、:

HashMap.mergeは、あなたがリストをマージする方法がある場合は、最初は空である場合におけるマップのラウンドを入れ替えることができ。

代わりに、あなたは最初のマップにだけputAllすべてをすることができます

if (current.isEmpty()) { 
    current.putAll(other); 
} 
+0

しかし、もう一度for-eachにないアイテムは追加しません。 ''他の ''マップの意味項目。 –

関連する問題