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

Java 根据值映射验证JsonNodes列表的最佳方法是什么?,java,java-stream,completable-future,Java,Java Stream,Completable Future,我有一张地图,上面有一个对象的名称和ID。从我的服务中,我得到了一个列表,其中每个JsonNode都包含一个名称,并且应该包含一个id。我想使用映射(它是权威的)来验证与JsonNode中的名称对应的id。例如: JsonNode Map Mark 23 Mark 23 Chris 43 Chris 43 Ralph 21 Ralph 31 在这种情况下,前两个匹配,最后一个不匹配。我希望遍历所有JsonNodes和映射,并收集节点id与映射id不匹配的所有名称 我可以使用以下代码使

我有一张地图,上面有一个对象的名称和ID。从我的服务中,我得到了一个列表,其中每个JsonNode都包含一个名称,并且应该包含一个id。我想使用映射(它是权威的)来验证与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());
//流式处理所有节点,筛选没有“id”或需要id的节点,
//收集到一个列表中。
nodes.stream().filter(r->{
String name=r.get(“name”).asText();
如果(r.has(“id”)){
Long nodeId=r.get(“id”).asText();
Long-expectedId=map.get(name);
if(expectedId==null){
返回false;
}
if(nodeId!=map.get(name)){
返回true;
}否则{
返回false;
}
}else{//节点中没有id
返回true;
}
}).map(r->r.get(“$id”).asText()).collect(Collectors.toList());
列表中的JsonNodes不超过2000个,通常要少得多(<100)。将其并行化有意义吗?如果是这样,使用
parallelStream
会是一个好方法吗?如果我使用parallelStream,我将创建自己的ForkJoinPool来更好地控制池大小。如果不是平行流,那么期货(像完全期货一样)会是更好的选择吗


谢谢

处理大小为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());

你为什么这么问?从你提供的信息来看,我不明白你为什么要使它平行。如果它已经运行得足够快,不要为了使它更快而引入额外的复杂性。2.这里没有人能告诉你它是否会在你的设置中加速。你必须自己测量。