Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayNode上的循环转换为流_Java_Json - Fatal编程技术网

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);