[英]How to iterate a list recursively on condition comparison using java8 stream
[英]How to iterate recursive list using lambda/java8
我正在尋求幫助,我正在嘗試迭代具有訂單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>();
}
您可以使用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.