首页 > 解决方案 > 如何将数组列表中的给定键与 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,要么我总是得到一个空返回。

标签: javaarrayshashmapcompare

解决方案


我可能错了,但据我了解,您想要验证以下条件:

  1. HashMap 键必须属于以下关键字列表{"id", "name", "lastname"}
  2. 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);

请注意,我使用集合工厂方法来创建MapListSet已添加到 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. 

希望这个对你有帮助。


推荐阅读