在ArrayNode变换上循环以流式传输

时间:2018-08-28 06:45:10

标签: java json

我正在尝试使用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。我必须实施此类吗?可以内联吗?所以我想这将是解决方案;)

2 个答案:

答案 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类可以提供addaddAll方法。这些都是您需要的:

ArrayNode newArray = arrayNodes.stream()
    .map(t -> convert((ObjectNode) t))
    .filter(YourClass::checkNotEmpty)
    .collect(mapper::createArrayNode, ArrayNode::add, ArrayNode::addAll);