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);
}

先感谢您。

Misha:

要在没有匹配项的情况下返回默认值,请使用 Optional#orElse

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

返回第一个结果匹配断言在Java流或所有非匹配结果

在Java 8中懒惰地返回第一个非空列表

如何转换for循环以查找Java流中的第一个匹配项?

Java 8从Map中的匹配值中提取所有键

Java中的正则表达式:匹配组,直到出现第一个符号

从Java中的字符串中提取第一个单词的最佳方法是什么?

如何获取Java中的第一个非空值?

在java中获取当月的第一个日期

如何从JAVA 11中的stream filter()获取第一个匹配元素?

如何从JAVA 11中的stream filter()获取第一个匹配元素?

在Java 8中从第一个流到下一个流api访问对象引用

在Java中以长文本查找给定子字符串的第一个匹配的完整单词

如何从Java 8的迭代器中获取n个第一个值?

如何使用Java 8流获得每个不同键的第一个值?

如何通过使用Java 8匹配Map中的键从JSON对象提取a值?

如何在Java ArrayList中返回第一个最大值

Java ArrayList缺少第一个值

根据条件(Java / Guava)从列表中提取第一个匹配项?

为什么ArrayList中的值总是返回null作为Java中的第一个值?

如何在Java中计算数组中的第一个重复值

Java:删除拆分中的第一个单词

返回Java 8流中的第一个匹配项(类似于_.find)

用Java中的第一个值对对数组进行排序

值对并使用第一个 java 进行排序

为什么 ArrayList 中的第一个值在 Java 中总是返回 null?

Java-从列表中读取第一个值并使用 Intellij 存储在变量中

错过java方法中的第一个输入值

如何从java中的列表列表中获取第一个值

根据Java中的值获取第一个LinkedHashMap键