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

前端之家收集整理的这篇文章主要介绍了Java 8从Map中的匹配值中提取第一个键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个给定名称,姓氏对的地图,并且我想要找到该地图中具有匹配一定值的姓氏的第一个条目的给定名称.
我们将如何以 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);
}

先谢谢你.

解决方法

如果不匹配,返回默认值,请使用 Optional#orElse
names.entrySet().stream()
  .filter(e -> e.getValue().equals("Donkey"))
  .map(Map.Entry::getKey)
  .findFirst()
  .orElse(null);

猜你在找的Java相关文章