1

命令式编码风格中的一个常见循环模式是遵循一系列对象来找到结尾,例如:

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

(来自这个答案

我觉得必须有一个标准的功能模式在逻辑上与此等效,但我不确定它是什么。我想出了下面使用Vavr 的Option递归方法:

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

但似乎应该有一种方法可以在没有显式递归的情况下做到这一点,尤其是在像 Java 这样没有尾调用优化的语言中(我在想象一些类似于foldLeft()但在迭代计算的价值流上的东西,如果这有任何意义的话?)

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

4

1 回答 1

1

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

Stream.iterate(leaf, ThreadGroup::getParent)
    .filter(g -> g.getParent() == null)
    .findFirst().get();
于 2017-11-18T00:42:49.093 回答