加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 17:48:08 所属栏目:Java 来源:网络整理
导读:假设我有一个给定名称,姓氏对的地图,并且我想要找到该地图中具有匹配一定值的姓氏的第一个条目的给定名称. 我们将如何以 java 8方式做到这一点. 在我下面的测试用例的例子中,我提出了两种方法. 然而,第一个(寻找名为“Donkey”的第一个人的给定名称)将抛出ja
假设我有一个给定名称,姓氏对的地图,并且我想要找到该地图中具有匹配一定值的姓氏的第一个条目的给定名称.
我们将如何以 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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读