java - 如何将数组列表中的给定键与 HashMap 键进行比较?
问题描述
在我的 WebApplication 中,我必须检查来自 requestBody 的许多传入查询参数。为了不在每个方法中编写相同的代码,我想编写一个返回布尔值的函数。当接收到所有必需的参数并且 entrySet 的值不为 null 时,该方法应返回 true(否则为 false),我可以稍后在程序中使用传入的查询参数。
因此,我将所有传入参数打包到一个 HashMap 中。此外,我在该方法中添加了一个特定列表,该列表提供了检查所需的参数(键)。
queryParams 的示例地图:
Map queryParams = new HashMap();
queryParams.put("id", "1");
queryParams.put("name", "Jane");
queryParams.put("lastname", "Doe");
示例数组:
String[] keys = {"id", "name", "lastname"};
方法的最新版本:
public static Boolean checkRequestParams(Request request, String[] keys) {
Map params = (JsonUtil.fromJson(request.body(), HashMap.class));
Iterator it = params.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
for (int i = 0; i < keys.length; i++) {
if (pair.getKey().equals(keys[i])) {
return true;
}
}
Array 提供的键是客户端发送的 QueryParams。不,我想比较它们并检查 Hashmap 中的键是否等于数组中的给定键,以及 Map 中键的值是否不为空。
我尝试了很多变化。要么我得到了 nullPointerExceptions,要么我总是得到一个空返回。
解决方案
我可能错了,但据我了解,您想要验证以下条件:
- HashMap 键必须属于以下关键字列表
{"id", "name", "lastname"}
。 - HashMap 中的任何值都不应等于 null。
你可能会使用类似这样的东西:
map.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null)
所以我们遍历 entrySet 并检查 entry 键是否属于定义的集合以及 value 是否不为空。这是一个更详细的示例:
Set<String> keys = Set.of("id", "name", "lastname");
Map<String,List<Integer>> map = Map.of("id", List.of(1,2,3), "name", List.of(4,5,6));
map.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null);
Map<String,List<Integer>> map1 = Map.of("id", List.of(1,2,3), "not in the keys", List.of(4,5,6));
map1.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null);
请注意,我使用集合工厂方法来创建Map
,List
它Set
已添加到 java-9,但从 java-8 开始可以使用流 api。
至于您的代码,您将始终得到true
,因为只要有一个满足条件的 entrySet,该方法就会返回结果。
for (int i = 0; i < keys.length; i++) {
if (pair.getKey().equals(keys[i])) {
return true; // one single match found return true.
}
}
您可以尝试反转条件并在出现不匹配时立即返回 false。
for (int i = 0; i < keys.length; i++) {
if (!pair.getKey().equals(keys[i]) || pair.getValue() == null) {
return false; // mismatch found, doesn't need to verify
// remaining pairs.
}
}
return true; // all pairs satisfy the condition.
希望这个对你有帮助。
推荐阅读
- testing - TestCafe : 如何在 TestCafe 中运行测试时设置浏览器的缩放级别
- javascript - 当 URL 中存在哈希时,防止浏览器滚动到元素但将其保留在 URL 中
- javascript - 在javascript中传递查询参数
- php - 用 PHP 生成 XLSX
- amazon-elastic-beanstalk - 通过 cloudformation 部署的 Elastic beanstalk 不会更新健康检查目标
- android - Android Studio 从源导入模块 - 无法指定模块名称
- python - 使用漂亮的汤在两个 div 中刮取一个 div 不会返回任何内容
- design-patterns - 策略模式中的两个策略可以使用相同的代码吗?这是否使它成为模板模式?
- git - 如何在旧的提交状态之上添加特定的 git 提交
- c# - 学习课程 - 我刚刚在函数中看到了一个奇怪的参数用法