2017-11-18 72 views
1

在必要的编码风格的常见循环模式是遵循对象链查找结束时,例如:走对象链递归函数式

private ThreadGroup rootOf(ThreadGroup leaf) { 
    ThreadGroup rootGroup = leaf; 
    ThreadGroup parentGroup; 
    while ((parentGroup = rootGroup.getParent()) != null) { 
    rootGroup = parentGroup; 
    } 
    return rootGroup; 
} 

(从this answer

我觉得必须有一个标准的功能模式,这在逻辑上等同于此,但我不确定它是什么。我拿出递归方法使用以下Vavr's Option

private ThreadGroup rootOf(ThreadGroup leaf) { 
    return Option.of(leaf.getParent()) // returns None for null 
    .map(this::rootOf) 
    .getOrElse(leaf); 
} 

但它好像有应该是一个办法做到这一点没有明确的递归,尤其是在无尾调用优化的(我像Java语言可能想象的东西与foldLeft()模糊不清,但在迭代计算的价值流上,如果这有什么意义呢?)

这里的标准功能方法是什么?

回答

1

Stream.iterate +过滤应该这样做:

Stream.iterate(leaf, ThreadGroup::getParent) 
    .filter(g -> g.getParent() == null) 
    .findFirst().get(); 
+0

而这个工程,因为该滤波器可以确保我们只迭代,直到我们达到根,然后停止我们NPE过吗? –

+1

是的。这正是如此。 – vandale

+0

如果树为空,则引发NoSuchElementException。可能用'''.headOption()'''替代''.findFirst()。get()'''并可能添加'''.filter(Objects :: nonNull)'''? – Zaaier