是否可以从com.fasterxml.jackson.databind.node.ArrayNode创建流?我试探着:
com.fasterxml.jackson.databind.node.ArrayNode
ArrayNode files = (ArrayNode) json.get("files"); Stream<JsonNode> stream = Stream.of(files);
但它实际上会给出流中的一个元素,初始的ArrayNode对象。正确的结果应该是Stream<JsonNode>,我能做到吗?
Stream<JsonNode>
ars1skjm1#
ArrayNode实作Iterable。Iterable有spliterator()方法。您可以使用
ArrayNode
Iterable
spliterator()
ArrayNode arrayNode = (ArrayNode) json.get("xyz"); StreamSupport.stream(arrayNode.spliterator(), false)
qyuhtwio2#
ArrayNode类提供随机访问:你可以通过索引得到size()和一个元素(使用get(index))。这就是创建一个好的流所需要的:
size()
get(index)
Stream<JsonNode> nodes = IntStream.range(0, files.size()).mapToObj(files::get);
注意这个解决方案比使用默认的拆分器(如其他回答者所建议的)更好,因为它可以很好地拆分并正确地报告大小。即使你不关心并行处理,一些操作如toArray()也会更有效地工作,因为提前知道大小将有助于分配一个适当大小的数组。
toArray()
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"));
3条答案
按热度按时间ars1skjm1#
ArrayNode
实作Iterable
。Iterable有spliterator()
方法。您可以使用qyuhtwio2#
ArrayNode
类提供随机访问:你可以通过索引得到size()
和一个元素(使用get(index)
)。这就是创建一个好的流所需要的:注意这个解决方案比使用默认的拆分器(如其他回答者所建议的)更好,因为它可以很好地拆分并正确地报告大小。即使你不关心并行处理,一些操作如
toArray()
也会更有效地工作,因为提前知道大小将有助于分配一个适当大小的数组。tuwxkamq3#
ArrayNode#elements会在其元素上传回Iterator,您可以使用它来建立Stream(利用StreamSupport)。StreamSupport需要分割器,若要从Iterator建立分割器,您可以使用分割器类别。
cyclops-streams有一个StreamUtils类,有一个静态方法,使这个更干净一点(我是作者)。
考虑到@JB Nizet的回答,即ArrayNode是一个带有StreamUtils的可迭代对象,您可以传入ArrayNode并直接返回Stream。