【问题标题】:How to iterate recursive list using lambda/java8如何使用 lambda/java8 迭代递归列表
【发布时间】:2020-02-04 19:28:59
【问题描述】:

我正在寻求帮助,我正在尝试迭代具有订单 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>();

}

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 我尝试过使用 DFS 和 BFS 方式,能够在 3 到 1 毫秒内达到。在 Java 8 上寻找函数式编程的有效方法。
  • @Naman : 你能帮帮我吗?
  • 我想,目前还没有人回答!!

标签: java list recursion optimization lambda


【解决方案1】:

您可以使用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);
}

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2021-02-09
    • 2022-01-15
    • 1970-01-01
    • 2012-03-03
    • 2015-05-26
    • 1970-01-01
    • 2019-12-25
    • 2019-10-13
    相关资源
    最近更新 更多