ObjectNode row = Json.newObject();
row.put("0", a);
row.put("1", x);
row.put("2", y);
现在我有了清单
List<String> list = new ArrayList<String>();
如何将其添加到行?
答案 0 :(得分:7)
您可以使用putArray
方法创建ArrayNode
。然后你应该用你的列表中的元素填充它。
ArrayNode arrayNode = row.putArray("myList");
for (String item : list) {
arrayNode.add(item);
}
答案 1 :(得分:1)
这是创建arrayNode并从流中填充元素的一种实用方法。它与上述fracz答案相同:
yourStringList.stream()
.collect(Collector.of(
() -> row.putArray("myList"),
(arrayNode, item) -> arrayNode.add(item),
(arrayNode1, arrayNode2) -> { arrayNode1.addAll(arrayNode2); return arrayNode1; },
Collector.Characteristics.IDENTITY_FINISH
));
从本质上讲,它定义了一个自定义收集器来累积流提供的元素。一些解释:
() -> row.putArray("myList")
定义了一个函数,该函数将提供用于累积项目的对象(称为 supplier 函数)。在我们的例子中,此函数将提供ArrayNode
,相当于上述答案中的ArrayNode arrayNode = row.putArray("myList");
语句。(arrayNode, item) -> arrayNode.add(item)
定义 accumulator 函数,其作用是添加元素。在->
运算符的左侧,第一个变量(例如arrayNode
)引用第一个参数中定义的容器,而第二个变量(例如item
)引用要累加的元素由流提供。在上例中,此函数与循环内的语句arrayNode.add(item);
相同。(arrayNode1, arrayNode2) -> { arrayNode1.addAll(arrayNode2); return arrayNode1; }
是 combiner 函数,如果以并行方式收集流(例如,如果我们使用.parralelStream()
而不是.stream()
,则使用该函数) )。它的作用是将两个累加器合并在一起,这就是为什么该函数具有两个相同类型的小数的原因。我们定义此函数,以便将第二个累加器中累加的所有元素添加到第一个累加器中,并返回第一个累加器。Collector.Characteristics.IDENTITY_FINISH
定义了该过程的一个或多个opton。在这种情况下,IDENTITY_FINISH
仅声明不提供任何 finisher 函数(以进一步处理累加器对象),或者换句话说,finisher函数是恒等函数(不处理)完成)。乍一看,此解决方案似乎更复杂,但它利用了函数式编程的所有功能。例如,在收集所有内容之前,我们可以流对象,使用map
函数,filter
提取String属性,等等。
yourObjectList.stream()
.map(o -> o.getTheStringProperty())
.filter(o -> o.length() > MIN_SIZE)
.collect(Collector.of(
() -> row.putArray("myList"),
(arrayNode, item) -> arrayNode.add(item),
(arrayNode1, arrayNode2) -> { arrayNode1.addAll(arrayNode2); return arrayNode1; },
Collector.Characteristics.IDENTITY_FINISH
));