根据值映射验证 JsonNode 列表的最佳方法是什么?

What is the best way to validate a List of JsonNodes against a Map of values?

我有一个包含对象名称和 ID 的映射。从我的服务中,我得到一个列表,其中每个 JsonNode 都包含一个名称,并且应该包含一个 ID。我想使用 Map(权威的)来验证与 JsonNode 中的名称对应的 id。例如:

JsonNode  Map
Mark 23   Mark 23
Chris 43  Chris 43
Ralph 21  Ralph 31

在这种情况下,前两个匹配,最后一个不匹配。我想遍历所有 JsonNodes 和地图并收集节点 ID 与地图 ID 不匹配的所有名称。

我可以使用以下代码使其工作:

// stream all the nodes, filter the nodes with either no "id" or with an id <> expected, 
// collect into a list.
nodes.stream().filter(r -> {
            String name = r.get("name").asText();
            if (r.has("id")) {
                Long nodeId = r.get("id").asText();
                Long expectedId = map.get(name);
                if (expectedId == null) {
                    return false;
                }
                if (nodeId != map.get(name)) {
                    return true;
                } else {
                    return false;
                }
            } else { //no id in node
                return true;
            }
        }).map(r-> r.get("$id").asText()).collect(Collectors.toList());

列表中的 JsonNode 不会超过 2000 个,通常更少 (< 100)。并行化这个有意义吗?如果是这样,使用 parallelStream 会是一个好方法吗?如果我使用 parallelStream,我将创建自己的 ForkJoinPool 以更好地控制池大小。如果不是 parallelStream,那么 futures(比如 CompletableFutures)会是更好的选择吗?

谢谢

处理大小为 2000 的列表应该不会花费太多时间,您也可以像这样使用单流

nodes.stream()
     .filter(r->r.has("id") && 
               !r.get("id").asText().equals(map.get(r.get("name").asText())))
     .map(r-> r.get("id").asText()).collect(Collectors.toList());

parallelStream,但并行流可以在执行期间消耗所有可用的处理器

nodes.parallelStream()
     .filter(r->r.has("id") && 
               !r.get("id").asText().equals(map.get(r.get("name").asText())))
     .map(r-> r.get("id").asText()).collect(Collectors.toList());