命令式编码样式中常见的循环模式是遵循对象链来找到终点,例如:

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();

09-05 08:29