2017-01-24 26 views
6

Mam mapę, która może zawierać jeden z następujących klawiszyJava: jeden z wielu kluczy map

Map<String, String> map = getMap(); 

teraz chcę sprawdzić, czy jeden z niektórych klawiszy są ustawione. Moje obecne podejście jest łańcuchem wielokrotności map.getOrDefault(...)

Address address = new Address(); 
address.setStreet(map.getOrDefault("STORE_STREET" 
    , map.getOrDefault("OFFICE_STREET", ...)); 

lub sprawdzić dla każdego klawisza, jeśli istnieje na mapie.

if(map.containsKey("STORE_STREET")){ 
    address.setStreet(map.get("STORE_STREET")); 
}else if(map.containsKey("OFFICE_STREET")){ 
    address.setStreet(map.get("OFFICE_STREET")); 
} 

Czy jest jakiś sposób, aby ułatwić/lepiej przeczytać? Niestety mapa jest podana jako taka.

+0

Chcesz przejść przez różne klawisze na mapie, znaleźć i użyć pierwszego zestawu? – Adowrath

+0

'address.setStreet (map.getOrDefault (" STORE_STREET " , map.getOrDefault (" OFFICE_STREET ", ...));' wygląda optymalnie dla mnie – VHS

+0

Co powiesz na kolekcję ciągów takich jak "store_street" itp. przepuszczanie ich podczas sprawdzania includeKey, a następnie ustawienie ich w obiekcie adresu? –

Odpowiedz

11

Normalnie getOrDefault będzie droga, ale jeśli masz kilka kluczy alternatywnych, to wpływa nie tylko czytelność, ale także włączyć przewagę wydajności w przeciwnym. Z kodem jak:

address.setStreet(map.getOrDefault("STORE_STREET", map.getOrDefault("OFFICE_STREET", ...)); 

szukasz klucze alternatywne pierwsze, aby uzyskać wartość jesień-back, przed patrząc nawet, czy klucz podstawowy (lub klucz o wyższym priorytecie) jest obecny.

W roztworze byłby być

Stream.of("STORE_STREET", "OFFICE_STREET", ...) 
     .map(map::get) 
     .filter(Objects::nonNull) 
     .findFirst() 
     .ifPresent(address::setStreet); 

Realizując ten jeden raz, jej wydajność może być mniejsza niż zwykła pętla, ze względu na wyższą narzutu inicjalizacji jednak różnica wyników będzie znaczenia czasu. W przypadku częstego wykonywania nie będzie znaczącej różnicy, więc powinieneś zdecydować na podstawie czytelności (co oczywiście jest subiektywne).

1
String []keys = {"STORE_STREET", "OFFICE_STREET", ...}; 
for (String k : keys) 
{ 
    if (map.containsKey(k)) 
    return map.get(k); 
} 

return ""; // or throw an exception