Java 8如何中断递归循环?

3

我有一个下面是嵌套对象的类,

public class Order implements Serializable {

    private String id;
    private List<Order> orders = new ArrayList<>();

    // getters and setters   
}

当我有完整的订单列表和订单ID时,尝试查找匹配的订单。

private Order findMatchingOrder(String id, List <Order> orders, Order order) {
 for (Order o: orders) {
  if (o.getId().equals(id)) {
   order = o;
   break;
  } else {
   findMatchingOrder(id, o.getOrders(), o);
  }
 }
 return order;
}

由于这是一个递归调用,即使我在if条件中使用了break,它仍会在执行break后执行else块,而不是从for循环中跳出并返回顺序。

有没有其他方法可以实现这个目标?最好使用Java 8。


“是否有其他方法可以实现这个?” - 是的:检查返回的内容。如果递归调用返回的不是 null,则通过返回已返回给您的内容来中断循环(您需要重构当前算法以实现此方法)。 - Turing85
我无法更改我的Order类,但我能更改的唯一事物是这个方法。我在想,既然它是嵌套的,是否可以使用流来实现。 - User0911
1个回答

4
您试图将返回值作为参数传递,但在此情况下无效。相反,我建议您返回找到的订单并检查该结果。
private Order findMatchingOrder(String id, List<Order> orders) {
    for (Order o: orders) {
        if (o.getId().equals(id)) 
            return o;

        Order found = findMatchingOrder(id, o.getOrders());
        if (found != null)
            return found;
    }
    return null;
}

谢谢,彼得。看起来很不错。让我试试。你有没有想过在这里使用流是否有意义,以及是否可行? - User0911
@User0911 流无法用于展开深树,而这正是你所拥有的。 - Andreas
@User0911,将递归解决方案转换为使用Stream并不容易。您可以使用自定义Spliterator来遍历树,但这会更加复杂。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接