Преобразование этого метода вложенного цикла в функцию Stream Lambda - PullRequest
0 голосов
/ 25 апреля 2018

Учитывая следующий метод с вложенным циклом 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 голосов
/ 25 апреля 2018

Вам нужна плоская карта, которая превратит поток потоков X в поток x.

При использовании потоков карта и flatmap ваши друзья для

Также для вещей, у которых нет метода stream (), но которые итеративны, вы можете сделать это

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

, например

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 
...