jackson 从数组节点创建Java 8流

j0pj023g  于 2022-11-09  发布在  Java
关注(0)|答案(3)|浏览(124)

是否可以从com.fasterxml.jackson.databind.node.ArrayNode创建流?
我试探着:

ArrayNode files = (ArrayNode) json.get("files");
Stream<JsonNode> stream = Stream.of(files);

但它实际上会给出流中的一个元素,初始的ArrayNode对象。
正确的结果应该是Stream<JsonNode>,我能做到吗?

ars1skjm

ars1skjm1#

ArrayNode实作Iterable。Iterable有spliterator()方法。您可以使用

ArrayNode arrayNode = (ArrayNode) json.get("xyz");
StreamSupport.stream(arrayNode.spliterator(), false)
qyuhtwio

qyuhtwio2#

ArrayNode类提供随机访问:你可以通过索引得到size()和一个元素(使用get(index))。这就是创建一个好的流所需要的:

Stream<JsonNode> nodes = IntStream.range(0, files.size()).mapToObj(files::get);

注意这个解决方案比使用默认的拆分器(如其他回答者所建议的)更好,因为它可以很好地拆分并正确地报告大小。即使你不关心并行处理,一些操作如toArray()也会更有效地工作,因为提前知道大小将有助于分配一个适当大小的数组。

tuwxkamq

tuwxkamq3#

ArrayNode#elements会在其元素上传回Iterator,您可以使用它来建立Stream(利用StreamSupport)。StreamSupport需要分割器,若要从Iterator建立分割器,您可以使用分割器类别。

ArrayNode files = (ArrayNode) json.get("files");
  Stream<JsonNode>  elementStream = StreamSupport.stream(Spliterators
                  .spliteratorUnknownSize(files.elements(),
                        Spliterator.ORDERED),false);

cyclops-streams有一个StreamUtils类,有一个静态方法,使这个更干净一点(我是作者)。

ArrayNode files = (ArrayNode) json.get("files");
 Stream<JsonNode>  elementStream = StreamUtils.stream(files.elements());

考虑到@JB Nizet的回答,即ArrayNode是一个带有StreamUtils的可迭代对象,您可以传入ArrayNode并直接返回Stream。

Stream<JsonNode>  elementStream = StreamUtils.stream((ArrayNode) json.get("files"));

相关问题