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

问题描述 投票:1回答:1

我有一个Map,其中包含对象的名称和ID。从我的服务中,我得到一个List,其中每个JsonNode都包含一个名称,并应包含一个ID。我想使用Map(具有权威性)来验证与JsonNode中的名称相对应的ID。例如:

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

在这种情况下,前两个匹配,最后一个不匹配。我想遍历所有JsonNodes和Map并收集节点ID与Map 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());

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

谢谢

java java-stream completable-future
1个回答
2
投票

大小为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());
© www.soinside.com 2019 - 2024. All rights reserved.