spa*_*ker 13 java lambda java-8 java-stream
我有一个List的Strings和Map.地图中的每个键都需要出现在列表中,否则我需要抛出异常.截至目前,我正在循环列表并检查密钥并在地图不包含密钥时抛出异常.下面是我正在做的示例代码.在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");
            }
        }
    }
}
地图中的每个键都需要出现在列表中,否则我需要抛出异常
您可以使用Stream.anyMatch并迭代keyset地图而不是(为了可读性目的而更新变量名称):
if(map.keySet().stream().anyMatch(key -> !list.contains(key))) {
    throw new CustomException("");
}
更好,更简单,使用List.containsAll:
if(!list.containsAll(map.keySet())) {
    throw new CustomException("");
} 
重要提示:如果你能换取O(n)空间,以减少运行时的复杂性,您可以创建HashSet出你的List,然后进行查找.它会从减少运行时的复杂性O(n^2),以O(n)和实施将是这样的:
Set<String> allUniqueElementsInList = new HashSet<>(list);
if(!allUniqueElementsInList.containsAll(map.keySet())) {
    throw new CustomException("");
}