如果特定密钥Java 8的存在值,请检入列表映射

Mar*_*uca 4 java dictionary list java-8 java-stream

在Java 7中我有

Map<String, List<String>> m = new HashMap<String, List<String>>();
boolean result = false;
m.put("Name1", Arrays.asList("abc*1"));
m.put("Name2", Arrays.asList("abc@*1"));


for (Map.Entry<String, List<String>> me : m.entrySet()) {
    String key = me.getKey();
    List<String> valueList = me.getValue();
    if (key.equals("Name2"){
        System.out.print("Values: ");
        for (String s : valueList) {
            if(s.contains("@"){
                result = true;
            }
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

Name2如果它包含@使用任何匹配,我怎么能得到一个bool结果呢?

我尝试使用以下代码,但我不知道如何使用IT来获取特定密钥

result = m.values().stream().anyMatch(v -> v.contains("@"))
Run Code Online (Sandbox Code Playgroud)

Nik*_*las 7

请执行下列操作:

boolean result = m.getOrDefault("Name2", Collections.emptyList()).stream()
    .anyMatch(i -> i.contains("@"));
Run Code Online (Sandbox Code Playgroud)

如果Map包含正确的密钥,请检查Listas值的任何元素是否包含特定字符.如果Map不包含密钥,则模拟Collection完全不包含任何内容的空,并自动计算结果false.

编辑:正如@Michael建议的那样,使用Collections.emptyList()是比较好的选择new ArrayList<>().

  • 这是最好的方法.当大多数地图专门设计为具有O(1)`get`时,为什么要遍历所有键? (2认同)
  • @Michael Java 9提供了一个中间解决方案:`Stream.ofNullable(m.get("Name2")).flatMap(List :: stream).anyMatch(i - > i.contains("@"))` (2认同)

Mic*_*ael 5

您可以简单地使用m.get("Name2"),将(可为空的)结果放入Optional,然后使用映射:

boolean result = Optional.ofNullable(m.get("Name2"))
    .map(l -> l.stream().anyMatch(s -> s.contains("@")))
    .orElse(false);
Run Code Online (Sandbox Code Playgroud)

这最好像HashMap.getO(1)那样循环访问条目集,并且对O进行迭代是O(n)。

  • 更好:`Optional.ofNullable(m.get(“ Name2”)).filter(l-&gt; l.stream()。anyMatch(s-&gt; s.contains(“ @”))).isPresent()` (3认同)