Załóżmy, że mam mapę z danymi nazwami, nazwami par i chcę znaleźć daną nazwę pierwszego wpisu na tej mapie, która ma nazwisko pasujące do określonej wartości. Jak to zrobimy w modzie Java.Java 8 wyodrębnia pierwszy klucz z pasującej wartości na mapie
W poniższym przykładzie przypadku testowego umieściłem dwa sposoby, aby to zrobić.
Jednak pierwszy (szukając imienia pierwszej osoby o nazwisku "Osioł") rzuci java.util.NoSuchElementException: Brak wartości, więc nie jest bezpieczny.
Drugi działa, ale nie tylko jest trudniejszy w czytaniu, ale jest nieco niezupełnie funkcjonalny.
Zastanawiam się, czy ktoś tutaj zaproponowałby mi łatwiejszy sposób na osiągnięcie tego przy pomocy stream()
lub forEach()
lub obu.
@Test
public void shouldBeAbleToReturnTheKeyOfTheFirstMatchingValue() throws Exception {
Map<String, String> names = new LinkedHashMap<>();
names.put("John", "Doe");
names.put("Fred", "Flintstone");
names.put("Jane", "Doe");
String keyOfTheFirst = names.entrySet().stream().filter(e -> e.getValue().equals("Doe")).findFirst().get().getKey();
assertEquals("John", keyOfTheFirst);
try {
names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst().get();
} catch (NoSuchElementException e){
// Expected
}
Optional<Map.Entry<String, String>> optionalEntry = names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst();
keyOfTheFirst = optionalEntry.isPresent() ? optionalEntry.get().getKey() : null;
assertNull(keyOfTheFirst);
}
Dziękuję z góry.
Oczywiście za pomocą dwukierunkowego mapę byłby bardziej efektywny. –
Ten kod [zapachów] (http://en.wikipedia.org/wiki/Code_smell). Słaby projekt. –
Cześć patryk. Całkowicie się z tobą zgadzam. Właśnie dlatego opublikowałem pytanie. Czy jesteś w stanie dostarczyć rozwiązanie? – Julian