首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用lambda/java8迭代递归列表

如何使用lambda/java8迭代递归列表
EN

Stack Overflow用户
提问于 2019-10-07 21:31:41
回答 1查看 411关注 0票数 0

我正在寻找帮助,当我试图迭代具有order list(OrderItem)的产品时,它也包含sub-OrderList(OrderItem)和相同的内部结构(n次)。

如何递归迭代所有订单并搜索已完成并添加了列表中所有已完成订单的操作?

我已经通过BFS/DFS做了,但正在寻找使用java函数式编程的最佳优化解决方案。蒂娅。

主要产品

代码语言:javascript
复制
Class ProductOrder
{    
  private List<OrderItem> orderItem = new ArrayList<OrderItem>();    
}

产品中的子项

其中还包含n个子项目

代码语言:javascript
复制
Class OrderItem{
    private String id;

    private String state;

    private Integer quantity;

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

}
EN

回答 1

Stack Overflow用户

发布于 2019-10-14 03:44:49

您可以通过在OrderItem中添加以下方法来使用Stream API解决问题

代码语言:javascript
复制
public Stream<OrderItem> allItems() {
    return Stream.concat(Stream.of(this), orderItem.stream().flatMap(OrderItem::allItems));
}

你也可以用一种通用的方式解决这个问题:

代码语言:javascript
复制
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方法,它的速度会快一点,但使用这个方法会更困难,因为你不能在它之后进行流水线操作:

代码语言:javascript
复制
public void forEach(Consumer<OrderItem> consumer) {
    consumer.accept(this);
    for (OrderItem item : orderItem) item.forEach(consumer);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58270614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档