2017-11-18 139 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