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

时间:2018-06-06 10:10:21

标签: java list dictionary 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;
            }
        }
    }
} 

如果Name2包含使用任何匹配的@,我怎样才能获得一个bool结果?

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

result = m.values().stream().anyMatch(v -> v.contains("@"))

8 个答案:

答案 0 :(得分:7)

执行以下操作:

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

如果Map包含正确的密钥,请检查List的任何元素是否包含特定字符。如果Map不包含密钥,请模拟完全不包含任何内容的空Collection,并将结果自动评估为false

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

答案 1 :(得分:5)

您只需使用m.get("Name2"),将(可空)结果放入Optional,然后使用映射:

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

这比循环遍历条目集更好,因为HashMap.get是O(1)并且迭代条目集是O(n)。

答案 2 :(得分:2)

怎么样?
String name = "Name1";
boolean result= m.containsKey(name) && m.get(name).stream().anyMatch(a -> a.contains("@"));

答案 3 :(得分:2)

试试这个:

boolean result = m.entrySet().stream()
    .filter(e -> e.getKey().equals(Name2))
    .map(Map.Entry::getValue)
    .flatMap(List::stream)
    .anyMatch(s -> s.contains("@"));

答案 4 :(得分:1)

entrySet()创建一个流,然后在anyMatch中提供您的条件:

result = m.entrySet()
          .stream()
          .anyMatch(v -> Objects.equals("Name2", v.getKey()) && 
               v.getValue().stream().anyMatch(s -> s.contains("@")));

或使用getOrDefault

result = m.getOrDefault("Name2", Collections.emptyList())
          .stream()
          .anyMatch(s -> s.contains("@"));

答案 5 :(得分:1)

只需添加正确的过滤条件:

m.entrySet()
.stream()
.anyMatch(entry-> entry.getKey().equals(Name2) && 
   entry.getValue()
.stream()
.anyMatch(string -> string.contains("@"))
.getValue();

答案 6 :(得分:1)

首先,您应该按所需的键进行过滤,然后您可以使用anyMatch来确定该键的值是否包含带有“@”字符的元素:

result = m.entrySet ()
          .stream ()
          .filter (e->e.getKey ().equals (Name2))
          .anyMatch (e->e.getValue ().stream ().anyMatch (s->s.contains ("@")));

答案 7 :(得分:0)

Map<Integer, String> result = hmap.entrySet() 
                             .stream() 
                             .filter(map -> map.getKey().equals("Name2")) 
                             .collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()))
                             .orElse(null);

这也处理NoSuchElementException。