检查映射中与Java中的List内容匹配的键

spa*_*ker 13 java lambda java-8 java-stream

我有一个ListStringsMap.地图中的每个键都需要出现在列表中,否则我需要抛出异常.截至目前,我正在循环列表并检查密钥并在地图不包含密钥时抛出异常.下面是我正在做的示例代码.在Java8中是否有任何其他方式我们可以在一行中使用streams和使用filters

此外,列表中的内容和地图中的键应匹配.我已经在单独的if条件下处理了.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestClass {

    public static void main(String[] args) {

        List<String> ll = new ArrayList<>();
        Map<String, Integer> m = new HashMap<>();
        ll.add("a");
        ll.add("b");
        ll.add("d");

        m.put("a", 1);
        m.put("b", 1);
        m.put("c", 1);

        if(ll.size() != m.size){
       System.out.println("Throw Exception");
         }

        for(String s : ll) {

            if(!m.containsKey(s)) {
                System.out.println("Throw Exception");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nam*_*man 7

地图中的每个键都需要出现在列表中,否则我需要抛出异常

您可以使用Stream.anyMatch并迭代keyset地图而不是(为了可读性目的而更新变量名称):

if(map.keySet().stream().anyMatch(key -> !list.contains(key))) {
    throw new CustomException("");
}
Run Code Online (Sandbox Code Playgroud)

更好,更简单,使用List.containsAll:

if(!list.containsAll(map.keySet())) {
    throw new CustomException("");
} 
Run Code Online (Sandbox Code Playgroud)

重要提示:如果你能换取O(n)空间,以减少运行时的复杂性,您可以创建HashSet出你的List,然后进行查找.它会从减少运行时的复杂性O(n^2),以O(n)和实施将是这样的:

Set<String> allUniqueElementsInList = new HashSet<>(list);
if(!allUniqueElementsInList.containsAll(map.keySet())) {
    throw new CustomException("");
}
Run Code Online (Sandbox Code Playgroud)