Предположим, что у меня есть карта заданного имени, фамилии, и я хочу найти заданное имя первой записи на той карте, у которой есть фамилия, соответствующая определенному значению. Как мы будем делать это с использованием java 8.
В приведенном ниже примере тестового примера я делаю два способа сделать это.
Однако первый (ищет имя первого человека с фамилией "Осел" ) будет бросать java.util.NoSuchElementException: нет значения, чтобы оно было безопасным.
Второй работает, но читать его не только труднее, но и немного не совсем функционально.
Просто интересно, может ли кто-нибудь предложить мне более простой способ достичь этого, используя либо stream()
, либо forEach()
, либо оба.
@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);
}
Спасибо заранее.