2015-11-16 10 views
5

próbuję połączyć dwie mapymergeMaps nie działa, gdy pierwsza mapa nie zawiera elementów?

 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; 
       })); 
    } 

ale gdy prąd ma 0 elementów, lambda nie jest wykonywany.

Czy łączenie nie powinno być połączone w przypadku, gdy nie jest możliwe połączenie?

chcę:

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

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

Zapomnij, że jesteś stara się łączyć mapy na sekundę, i wyobraź sobie nazywać 'forEach' na pustej listy: ile razy będzie lambda zostać stracony? –

+0

Oprócz tego, że modyfikujesz mapę "innego", innymi słowy, 'map2' i' map3' są identyczne, kod dokładnie robi to, co opisujesz. Nie jest jasne, dlaczego oczekujesz czegoś innego i po co. Gdy obie mapy mają rozłączne klucze, wyrażenie lambda również nie zostanie wykonane. – Holger

Odpowiedz

1

Jeśli zadzwonisz forEach na pustej kolekcji, nie ma oczywiście nic na których można wykonać lambda.

Jeśli HashMap.merge jest sposób chcesz scalić list, można zamienić rundę map w przypadku, gdy pierwszy jest pusta:

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

jednak, że będzie dodać elementy do other, zamiast current .

Alternatywnie, można po prostu putAll wszystko do pierwszej mapy:

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

, ale z drugiej strony nie doda elementów, których nie ma w zestawie. Znaczenie elementów na "innej" mapie. –