命令式编码样式中常见的循环模式是遵循对象链来找到终点,例如:
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()
的东西,但是在迭代计算的值流上,如果那样的话)有道理吗?)这里的标准功能方法是什么?
最佳答案
Stream.iterate +过滤应该做到这一点:
Stream.iterate(leaf, ThreadGroup::getParent)
.filter(g -> g.getParent() == null)
.findFirst().get();