在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("@"))
答案 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。