Java8中断递归循环

Java8中断递归循环,java,java-8,Java,Java 8,我有一个嵌套对象类 public class Order implements Serializable { private String id; private List<Order> orders = new ArrayList<>(); // getters and setters } 公共类顺序实现可序列化{ 私有字符串id; 私有列表顺序=新的ArrayList(); //接球手和接球手 } 当我有完整的列表和订单id时,尝

我有一个嵌套对象类

public class Order implements Serializable {

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

    // getters and setters   
}
公共类顺序实现可序列化{
私有字符串id;
私有列表顺序=新的ArrayList();
//接球手和接球手
}
当我有完整的列表和订单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;
}
私人订单findMatchingOrder(字符串id、列表订单、订单订单){
对于(订单o:订单){
如果(o.getId().equals(id)){
顺序=o;
打破
}否则{
findMatchingOrder(id,o.getOrders(),o);
}
}
退货单;
}
因为这是一个递归调用,即使在if条件中有一个break,它也会在执行break之后执行else块,而不是退出for循环并返回顺序


有没有其他方法来实现这一点?最好是Java 8。

您试图将返回值作为参数传递,但在本例中不起作用。相反,我建议您返回找到的订单并检查结果

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;
}
私人订单findMatchingOrder(字符串id,列表订单){
对于(订单o:订单){
如果(o.getId().equals(id))
返回o;
Order found=findMatchingOrder(id,o.getOrders());
如果(找到!=null)
发现退货;
}
返回null;
}

“是否有其他方法实现此目的?”-是:检查返回的内容。如果递归调用返回的不是
null
,请通过返回返回给您的内容来打破循环(您需要重构当前算法以实现此方法)。尽管如此,我无法更改Order类,唯一可以更改的是此方法。我在想,既然它是嵌套的,那么这可以通过使用流来实现吗?谢谢,彼得。这看起来不错。让我试一试。您知道使用流在这里是否有意义,是否可行吗?@User0911 streams不能用于展平深层树,而这正是您所拥有的。@User0911使用流将递归解决方案转换为递归解决方案并不容易。您可以使用自定义拆分器来导航树,但这将更加复杂。