如果存在特定键Java 8的值,请签入列表的映射
在Java7中,我有如果存在特定键Java 8的值,请签入列表的映射,java,list,dictionary,java-8,java-stream,Java,List,Dictionary,Java 8,Java Stream,在Java7中,我有 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&
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;
}
}
}
}
从
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("@"));
只需添加正确的过滤条件:
m.entrySet()
.stream()
.anyMatch(entry-> entry.getKey().equals(Name2) &&
entry.getValue()
.stream()
.anyMatch(string -> string.contains("@"))
.getValue();
首先,您应该按所需的键进行筛选,然后可以使用
anyMatch
确定该键的值是否包含带有“@”字符的元素:
result = m.entrySet ()
.stream ()
.filter (e->e.getKey ().equals (Name2))
.anyMatch (e->e.getValue ().stream ().anyMatch (s->s.contains ("@")));
那怎么办
String name = "Name1";
boolean result= m.containsKey(name) && m.get(name).stream().anyMatch(a -> a.contains("@"));
请执行以下操作:
boolean result = m.getOrDefault("Name2", Collections.emptyList()).stream()
.anyMatch(i -> i.contains("@"));
如果映射
包含正确的键,请检查列表
as值中的任何元素是否包含特定字符。如果映射
不包含键,则模拟空的集合
,该集合根本不包含任何内容,结果将自动评估为false
编辑:正如@Michael所建议的,使用比使用新的ArrayList()更好的选择
boolean result = m.entrySet().stream()
.filter(e -> e.getKey().equals(Name2))
.map(Map.Entry::getValue)
.flatMap(List::stream)
.anyMatch(s -> s.contains("@"));
您只需使用
m.get(“Name2”)
,将(可为空的)结果放入可选的,然后使用映射:
boolean result = Optional.ofNullable(m.get("Name2"))
.map(l -> l.stream().anyMatch(s -> s.contains("@")))
.orElse(false);
这比在条目集上循环更可取,因为HashMap.get
是O(1),在条目集上迭代是O(n)。您的意思是if(s.contains(“@”)
?(双引号,而不是双撇号)对于If
和'
(两个撇号)您有If
,而不是”
。这段代码应该是可编译的吗?这是最好的方法。当大多数贴图都专门设计为具有O(1)时,为什么要迭代所有键get
?@michaeljava9提供了一个中间解决方案:Stream.ofNullable(m.get(“Name2”)).flatMap(List::Stream)。anyMatch(i->i.contains(“@”))
@Holger这完全不同,值得自己回答,你不这样认为吗?@Michael这是不同的代码,但不是根本不同的逻辑,所以我不会添加一个只包含一个小代码片段的答案。如果你愿意,你可以添加它作为答案的替代品。@Michael我不反对所有这些答案,但我不想再添加一个。顺便说一句,我看到了一个根本的区别。有些答案在地图上做线性迭代,有些答案可以避免。地图应该是.map(l->l.stream().anyMatch(s->s.contains(“@”)
更好:可选的.ofNullable(m.get(“Name2”)。过滤器(l->l.stream().anyMatch(s->s.contains(@)).isPresent()
boolean result = Optional.ofNullable(m.get("Name2"))
.map(l -> l.stream().anyMatch(s -> s.contains("@")))
.orElse(false);