簡體   English   中英

如何使用 lambda/java8 迭代遞歸列表

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

我正在尋求幫助,我正在嘗試迭代具有訂單listOrderItem )的產品,該訂單列表還包含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>();

}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM