我正在尝试使用streams()来转换此代码。我正在使用杰克逊图书馆。
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
关于如何解决它的任何想法?
编辑:
我找到了this。我必须实施此类吗?可以内联吗?所以我想这将是解决方案;)
答案 0 :(得分:0)
像这样吗?
ArrayNode newArray = mapper.createArrayNode();
arrayNodes.stream()
.map(YourClass::convert)
.filter(YourClass::checkNotEmpty)
.forEach(newArray::add);
我知道这不是单行的,但为什么还要麻烦编写自定义收集器呢?
您可以这样操作(ArrayNode
有一个addAll
iirc)
arrayNodes.stream()
.map(YourClass::convert)
.filter(YourClass::checkNotEmpty)
.forEach(newArray::add);
.collect( mapper.createArrayNode(),
(l, e) -> l.add(e),
(l1, l2) -> l1.addAll(l2));
答案 1 :(得分:0)
您当然可以创建一个新的Collector
。您找到的链接中的一个仅执行您想要的操作。当您多次需要此作品时,此功能特别有用。
但是,如果您只想编写一条语句,则collect
类中Stream
方法的重载版本之一将接受一个提供程序,一个累加器和一个组合器。 ObjectMapper
类可以通过ArrayNode
方法创建一个createArrayNode
实例,而ArrayNode
类可以提供add
和addAll
方法。这些都是您需要的:
ArrayNode newArray = arrayNodes.stream()
.map(t -> convert((ObjectNode) t))
.filter(YourClass::checkNotEmpty)
.collect(mapper::createArrayNode, ArrayNode::add, ArrayNode::addAll);