Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果存在特定键Java 8的值,请签入列表的映射_Java_List_Dictionary_Java 8_Java Stream - Fatal编程技术网

如果存在特定键Java 8的值,请签入列表的映射

如果存在特定键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&

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