Angenommen, ich habe eine Karte mit Vornamen, Nachnamen und möchte den Vornamen des ersten Eintrags in dieser Karte finden, der den Nachnamen mit einem bestimmten Wert hat. Wie würden wir das in einer Java 8 Mode machen.Java 8 extrahiere ersten Schlüssel von passendem Wert in einer Karte
In meinem Testfall Beispiel unten habe ich zwei Möglichkeiten, die es tun würde.
Die erste (Suche nach dem Vornamen der ersten Person mit dem Nachnamen "Donkey") wird java.util.NoSuchElementException werfen: Kein Wert vorhanden, so dass es nicht sicher ist.
Die zweite funktioniert, aber es ist nicht nur schwieriger zu lesen, aber es ist ein bisschen nicht ganz funktionsfähig.
Ich frage mich nur, ob jemand hier mir einen einfacheren, klareren Weg vorschlagen würde, dies entweder mit stream()
oder forEach()
oder beidem zu erreichen.
@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);
}
Vielen Dank im Voraus.
Offensichtlich eine bidirektionale Karte unter wäre effizienter. –
Dieser Code [riecht] (http://en.wikipedia.org/wiki/Code_smell). Schlechtes Design. –
Hallo Patryk. Ich stimme dir vollkommen zu. Deshalb habe ich die Frage gestellt. Können Sie eine Lösung anbieten? – Julian