将此嵌套循环方法转换为Stream Lambda函数

时间:2018-04-25 14:59:41

标签: java foreach java-8 jackson java-stream

使用嵌套for循环给出以下方法:

private Set<PlanningItem> getPlanningItems(Set<JsonNode> nodes) {
    Set<PlanningItem> planningItems = new HashSet<>();
    for (JsonNode node : nodes) {
      for (JsonNode planningItem : node.findPath(PLANNING_ITEMS.getValue())) {
        planningItems.add(new PlanningItem(planningItem));
      }
    }     
    return planningItems;
  }

我已将其转换为嵌套的forEach方法,如下所示:

private Set<PlanningItem> getPlanningItems(Set<JsonNode> nodes) {
    Set<PlanningItem> planningItems = new HashSet<>();
    nodes.forEach(node -> node.findPath(PLANNING_ITEMS.getValue()).forEach(planningItem -> planningItems.add(new PlanningItem(planningItem))));
    return planningItems;
}

我很好奇是否可以使用嵌套流完成此操作,或者如果这个简单的结构以及我们正在使用JsonNode集合而不是内置流方法。

1 个答案:

答案 0 :(得分:4)

您需要的是平面图,这会将X流流转换为x流。

使用流时,地图和平面地图是您的朋友

对于那些没有stream()方法但可迭代的东西,你可以这样做

StreamSupport.stream(iterable.spliterator(), false);

e.g。

nodes.stream() //stream of JsonNode objects
    .flatMap(node -> StreamSupport.stream(node.findPath(PLANNING_ITEMS.getValue()).spliterator(), false)) //stream of JsonNode from the node.findPath
    .map(planningItem-> new PlanningItem(planningItem)) //converts node to PlanningItem
    .collect(Collectors.toSet()); //collects to a set