Java ArrayNode上的循环转换为流
我正在尝试使用流来转换此代码。我在用杰克逊图书馆Java ArrayNode上的循环转换为流,java,json,Java,Json,我正在尝试使用流来转换此代码。我在用杰克逊图书馆 JsonNode convert(final ObjectNode src) {} boolean checkNotEmpty(final JsonNode node) {} ArrayNode newArray = mapper.createArrayNode(); for (final JsonNode node: arrayNodes) { JsonNode newNode = convert((ObjectNo
JsonNode convert(final ObjectNode src) {}
boolean checkNotEmpty(final JsonNode node) {}
ArrayNode newArray = mapper.createArrayNode();
for (final JsonNode node: arrayNodes) {
JsonNode newNode = convert((ObjectNode) fiwareNode);
if (checkNotEmpty(newNode)) {
newArray.add(newNode);
}
}
目前我有:
ArrayNode a = StreamSupport.stream(nodes.spliterator(), true)
.map(e -> convert((ObjectNode)e))
.filter(e -> checkNotEmpty(e))
.collect(Collector.of(
mapper.createArrayNode(), // init accumulator
ArrayNode::add, // processing each element
));
然而,我得到:
The type ArrayNode does not defined add(R,T) that is applicable here
你知道怎么修吗
编辑:
我找到了。我必须实现这个类吗?有没有可能在线进行?所以我想这将是解决方案 像这样的
ArrayNode newArray = mapper.createArrayNode();
arrayNodes.stream()
.map(YourClass::convert)
.filter(YourClass::checkNotEmpty)
.forEach(newArray::add);
我知道它不是一行一行的,但是为什么要费心写一个定制的收集器呢
你可以像这样做ArrayNode有一个addAll iirc
当然,您可以创建一个新的收集器。你找到的链接中的那个只做了你想让它做的事。当您多次需要此部件时,这一点尤其有用
但是,如果您只想编写一条语句,那么流类中collect方法的重载版本之一接受一个提供者、一个累加器和一个组合器。ObjectMapper类可以通过createArrayNode方法创建ArrayNode实例,而ArrayNode类提供add和addAll方法。这些就是您所需要的:
ArrayNode newArray = arrayNodes.stream()
.map(t -> convert((ObjectNode) t))
.filter(YourClass::checkNotEmpty)
.collect(mapper::createArrayNode, ArrayNode::add, ArrayNode::addAll);
这是我的第一个选择,但我想知道如何使用收集器;请看我对这个问题的编辑。你可以内联构造一个收集器,但它不是很可读。您的链接文章创建了一个很好的自定义收集器,我将在这里使用它:您的代码不完整。Collector.of至少接受三种元素。谢谢。。我意识到我没有发布完整的代码:我想答案是我包含的链接。
ArrayNode newArray = arrayNodes.stream()
.map(t -> convert((ObjectNode) t))
.filter(YourClass::checkNotEmpty)
.collect(mapper::createArrayNode, ArrayNode::add, ArrayNode::addAll);