Java 8从Map中的匹配值中提取第一个键

Jul*_*ian 19 java lambda optional java-8 java-stream

假设我有一个给定名称,姓氏对的地图,我想找到该地图中第一个条目的名称,该名称的姓氏与某个值相匹配.我们如何以java 8的方式做到这一点.

在我下面的测试用例中,我提出了两种方法.

然而,第一个(寻找姓氏为"Donkey"的第一个人的名字)将抛出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);
}
Run Code Online (Sandbox Code Playgroud)

先感谢您.

Mis*_*sha 55

要在没有匹配项时返回默认值,请使用 Optional#orElse

names.entrySet().stream()
  .filter(e -> e.getValue().equals("Donkey"))
  .map(Map.Entry::getKey)
  .findFirst()
  .orElse(null);
Run Code Online (Sandbox Code Playgroud)

  • 如果你真的希望使用`orElseGet`而不是`orElse`,你可以使用lambda表达式而不是匿名类:`.orElseGet(() - > null)`. (3认同)