在我的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还是总是返回null。
答案 0 :(得分:1)
我可能是错的,但是据我了解,您想验证以下条件:
{"id", "name", "lastname"}
的以下列表。您可能会使用与此类似的内容:
map.entrySet()
.stream()
.allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null)
因此,我们遍历entrySet并检查entry键是否属于已定义的集以及value是否不为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);
请注意,我正在使用collections工厂方法来创建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.
希望您觉得这有用。
答案 1 :(得分:0)
如果找到匹配项,则不应立即返回,因为我们要测试“所有必需的”参数。尝试类似的东西:
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;
}
答案 2 :(得分:0)
只需使用香草Java,您就可以尝试这样的事情。
SupportMapFragment
但是我建议您使用验证框架,如果您的项目允许它进行更准确的验证。
答案 3 :(得分:0)
您要在第一个匹配键上返回true
,而您要检查是否存在所有键。此外,您的代码不完整,因此无法进行完整的诊断。
但是无论如何,在这里遍历地图是没有意义的。只需使用
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
,即使其键不是必需键之一,也可以认为该映射无效。然后,就像
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);
}