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");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
地图中的每个键都需要出现在列表中,否则我需要抛出异常
您可以使用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)
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |