Как перебрать рекурсивный список с помощью lambda / java8 - PullRequest
0 голосов
/ 07 октября 2019

Мне нужна помощь, когда я пытаюсь перебрать продукт с порядком list (OrderItem), который также содержит sub-OrderList (OrderItem), а также содержит структуру внутри него (n раз).
Как рекурсивно выполнить итерации всех заказов и выполнить поиск, выполнив и добавив все выполненные заказы в список?

Я прошел через BFS / DFS, но ищу лучшее оптимизированное решение с использованием функционального программирования на Java. ,TIA.

Основной продукт

Class ProductOrder
{    
  private List<OrderItem> orderItem = new ArrayList<OrderItem>();    
}

Подпункты в продукте

Также есть n подпунктов внутри

Class OrderItem{
    private String id;

    private String state;

    private Integer quantity;

    private List<OrderItem> orderItem = new ArrayList<OrderItem>();

}

1 Ответ

0 голосов
/ 13 октября 2019

Вы можете решить свою проблему, используя Stream API , добавив следующий метод к OrderItem:

public Stream<OrderItem> allItems() {
    return Stream.concat(Stream.of(this), orderItem.stream().flatMap(OrderItem::allItems));
}

Вы также можете решить эту проблему общим способом:

public static <E> Stream<E> recursiveStream(
        E input,
        Function<? super E, ? extends Stream<? extends E>> mapper
) {
    return Stream.concat(
            Stream.of(input),
            mapper.apply(input).flatMap(item -> recursiveStream(item, mapper))
    );
}

public static <E> Stream<E> recursiveCollection(
        E input,
        Function<? super E, ? extends Collection<? extends E>> mapper
) {
    return recursiveStream(input, mapper.andThen(Collection::stream));
}

Если это решение недостаточно быстрое, создайте метод forEach, он будет работать немного быстрее, но его труднее использовать, поскольку после него невозможно выполнить конвейерные операции:

public void forEach(Consumer<OrderItem> consumer) {
    consumer.accept(this);
    for (OrderItem item : orderItem) item.forEach(consumer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...