从ArrayNode创建Java 8流

时间:2015-09-20 20:07:23

标签: jackson java-8 java-stream fasterxml

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

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

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

2 个答案:

答案 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())也会更有效,因为事先了解大小将有助于分配适当大小的数组。