我正在寻找帮助,我正在尝试迭代具有订单list
(OrderItem
)的产品,该产品还包含子订单列表(
OrderItem
),并且其中也包含结构(n次)
如何递归迭代所有订单,搜索已完成的操作,并将所有已完成的订单添加到列表中?
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>();
}
通过将以下方法添加到OrderItem
,可以使用流API解决问题:
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));
}
如果这个解决方案不够快,请为每个方法创建,它的工作速度稍微快一点,但是使用这个方法更难,因为您不能在它之后进行管道操作:
public void forEach(Consumer<OrderItem> consumer) {
consumer.accept(this);
for (OrderItem item : orderItem) item.forEach(consumer);
}
如果说在任何地方都使用递归,那么可以使用for循环,对吗?如果递归通常比较慢,那么将其用于循环迭代的技术原因是什么? 如果总是可以将递归转换为for循环,那么有经验法则吗?
我试图用`stream,特别是嵌套的foreach循环,将以下代码重构为lambda表达式: 我的开头是:
前面几节介绍了两个可以方便地用递归与迭代实现的函数。本节要比较递归与迭代方法,介绍为什么程序员在不同情况下选择不同方法。 递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计
问题内容: 我正在编写一个递归函数,其目的是迭代pList文件。我的代码是 但是当我调用函数“ HashMapper((Map)((Map)entry).keySet());”时。我有一个例外 java.util.HashMap $ HashMap条目不能转换为java.util.Map 我不知道如何调用函数以及如何将Hashmap条目转换为Map 问题答案: 入境确实不是。它是,因此您可以根据需
我在scheme中构建了一个递归函数,它将在一些输入上重复给定的函数f,n次。 我需要用尾递归构建这个函数的迭代版本,如果我正确理解尾递归,我认为我做得对。 我的问题是,这真的是迭代的吗?我相信我已经使用尾部递归正确地构建了它,但从技术上讲,它仍然将一系列操作推迟到count=0,在这里,它执行叠加的任意多个组合。
我有两种不同的方法,一种是用迭代法计算第n个元素的斐波那契序列,另一种是用递归法。 程序示例如下所示: 我试图找出哪种方法更快。我得出的结论是,对于较小数量的数字,递归速度更快,但随着第n个元素的值增加,递归速度变慢,迭代速度变快。以下是三个不同n的三个不同结果: 示例#1(n=10) 示例#2(n=20) 示例#3(n=30) 我真正想知道的是,为什么迭代突然变得更快,递归变得更慢。如果我错过了