简体   繁体   English

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

[英]How to iterate recursive list using lambda/java8

I am looking for help where I'm trying to iterate product having order list ( OrderItem ) which also contains sub-OrderList ( OrderItem ) and the same also contains structure inside it (n times).我正在寻求帮助,我正在尝试迭代具有订单listOrderItem )的产品,该订单列表还包含sub-OrderList订单列表( OrderItem ),并且同样包含其中的结构(n 次)。
How to iterate recursively all the orders and search for action having completed and added all the completed Order in the list?如何递归地迭代所有订单并搜索已完成的操作并将所有已完成的订单添加到列表中?

I have done through BFS/DFS but looking for best optimized solution using functional programming in java.我已经完成了 BFS/DFS,但正在寻找使用 java 中的函数式编程的最佳优化解决方案。 TIA. TIA。

Main Product主要产品

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

Sub items in product产品中的子项

Also have n sub-items inside it里面还有n个子项

Class OrderItem{
    private String id;

    private String state;

    private Integer quantity;

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

}

You can solve your problem using Stream API by adding the following method to OrderItem :您可以使用Stream API通过将以下方法添加到OrderItem来解决您的问题:

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

You can also solve this problem in a generic way:您也可以通过通用方式解决此问题:

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));
}

If this solution isn't fast enough, create forEach method, it works a little bit faster, but it's harder to use this method since you can't pipeline operations after it:如果此解决方案不够快,请创建forEach方法,它的工作速度会快一点,但使用此方法更难,因为您无法在它之后进行流水线操作:

public void forEach(Consumer<OrderItem> consumer) {
    consumer.accept(this);
    for (OrderItem item : orderItem) item.forEach(consumer);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM