如何将阵列列表中的键与hashmap键进行比较



在我的WebApplication中,我必须检查请求机体的许多传入查询参数。为了不在每种方法中编写相同的代码,我想编写一个返回布尔值的函数。当收到所有必需的参数并且输入集的值不为null时,方法应返回true(否则为false(,我可以在程序中使用传入查询参数。

因此,我将所有传入参数包装到哈希图中。此外,我将特定列表放入该方法中,该列表提供了所需的参数(密钥(以进行检查。

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;
                }
            }

数组提供的键是客户端发送的Queryparams。不,我想比较它们,并检查hashmap中的键是否等于数组中的给定键,以及地图中键的值是否不为null。

我尝试了许多变体。我有NullPoInterExceptions,或者我总是得到零返回。

我可能错了,但是正如我所知,您想验证以下条件:

  1. Hashmap键必须属于以下关键字 {"id", "name", "lastname"}的列表。
  2. Hashmap中没有值等于null。

您可能会使用类似的东西:

map.entrySet()
   .stream()
   .allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null)

因此,我们在输入集上迭代,并检查输入密钥是否属于定义的集合以及值不是null。这是一个更详细的示例:

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以来,Stream API可用。

至于您的代码,您将始终获得true,因为一旦有一个满足条件的输入集,该方法将返回结果。

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. 

希望您发现这有用。

仅使用香草爪哇

import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ValidatorExample {
    public boolean checkRequestParams(Map<String, Object> request, List<String> keys) {
        return isEqualCollection(request.keySet(), keys)
                && !containsAnyNull(request.values());
    }
    private boolean isEqualCollection (Collection<?> a,Collection<?> b){
        return a.size() == b.size()
                && a.containsAll(b)
                && b.containsAll(a);
    }
    private boolean containsAnyNull(Collection<?> collection){
        return collection.contains(null);
    }
    public static void main(String[] args) {
        ValidatorExample validatorExample = new ValidatorExample();
        List<String> keys = Arrays.asList("id", "name", "lastname");
        Map<String, Object> parametersOk = new HashMap<>();
        parametersOk.put("id", "idValue");
        parametersOk.put("name", "nameValue");
        parametersOk.put("lastname", "lastnameValue");
        // True expected
        System.out.println(validatorExample.checkRequestParams(parametersOk, keys));
        Map<String, Object> parametersWithInvalidKey = new HashMap<>();
        parametersWithInvalidKey.put("id", "id");
        parametersWithInvalidKey.put("name", "nameValue");
        parametersWithInvalidKey.put("lastname", "lastnameValue");
        parametersWithInvalidKey.put("invalidKey", "invalidKey");
        // False expected
        System.out.println(validatorExample.checkRequestParams(parametersWithInvalidKey, keys));
        Map<String, Object> parametersWithNullValue = new HashMap<>();
        parametersWithNullValue.put("id", null);
        parametersWithNullValue.put("name", "nameValue");
        parametersWithNullValue.put("lastname", "lastnameValue");
        // False expected
        System.out.println(validatorExample.checkRequestParams(parametersWithNullValue, keys));
    }

}

,但我建议您使用验证框架,如果您的项目允许进行更准确的验证。

如果找到匹配项,则不应立即返回,因为我们想测试'所有必需的'参数。尝试以下操作:

String[] keys = {"id, "name", "lastname"};
public static Boolean checkRequestParams(Request request, String[] keys) {
    Map params = (JsonUtil.fromJson(request.body(), HashMap.class));
    for (int i = 0; i < keys.length; i++) {
        Iterator it = params.entrySet().iterator();
        boolean found = false;
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            if (pair.getKey().equals(keys[i])) {
                found = true;
                break;
            }
        }
        if (!found) {
            return false;
        }
    }
    return true;
}

您将在第一个匹配键上返回true,而您要检查是否存在 all 键。此外,您的代码不完整,因此,不可能提供完整的诊断。

但是,无论如何,在这里迭代没有任何意义。只需使用

public static Boolean checkRequestParams(Request request, String[] keys) {
    Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
    for(String key: keys) {
        if(params.get(key) == null) return false;
    }
    return true;
}

这将确保每个键都存在而不会映射到null(因为"不映射到null"已经意味着存在(。

当不考虑将明确映射到null的可能性时,您可以检查所有键的存在,就像

一样简单
public static Boolean checkRequestParams(Request request, String[] keys) {
    Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
    return params.keySet().containsAll(Arrays.asList(keys));
}

另外,如果任何映射值为null,您也可以考虑MAP无效,即使其密钥不是强制性键之一。然后,这将像

一样简单
public static Boolean checkRequestParams(Request request, String[] keys) {
    Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
    return params.keySet().containsAll(Arrays.asList(keys))
        && !params.values().contains(null);
}

相关内容

  • 没有找到相关文章

最新更新