gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:38:40 25 4
gpt4 key购买 nike

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

关于java - 如何使用 lambda/java8 迭代递归列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58270614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com