是否可以从com.fasterxml.jackson.databind.node.ArrayNode
创建流?
我试过了:
ArrayNode files = (ArrayNode) json.get("files");
Stream<JsonNode> stream = Stream.of(files);
但它实际上会给出一个元素的流,即初始的ArrayNode对象
正确的结果应该是Stream<JsonNode>
,我能实现吗?
答案 0 :(得分:19)
ArrayNode
实施Iterable
。 Iterable有一个spliterator()
方法。您可以create a sequential Stream from a Spliterator使用
StreamSupport.stream(spliterator, false)
答案 1 :(得分:12)
ArrayNode
类提供随机访问:您可以按索引获取size()
和元素(使用get(index)
)。这就是创建良好流所需的全部内容:
Stream<JsonNode> nodes = IntStream.range(0, files.size()).mapToObj(files::get);
请注意,此解决方案优于使用默认的spliterator(由其他回答者建议),因为它可以很好地拆分并正确报告大小。即使您不关心并行处理,某些操作(如toArray()
)也会更有效,因为事先了解大小将有助于分配适当大小的数组。