Java 以函数式方式递归遍历对象链
命令式编码样式中的一种常见循环模式是遵循一系列对象来查找结尾,例如:Java 以函数式方式递归遍历对象链,java,functional-programming,tail-recursion,vavr,Java,Functional Programming,Tail Recursion,Vavr,命令式编码样式中的一种常见循环模式是遵循一系列对象来查找结尾,例如: private ThreadGroup rootOf(ThreadGroup leaf) { ThreadGroup rootGroup = leaf; ThreadGroup parentGroup; while ((parentGroup = rootGroup.getParent()) != null) { rootGroup = parentGroup; } return rootGroup
private ThreadGroup rootOf(ThreadGroup leaf) {
ThreadGroup rootGroup = leaf;
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
rootGroup = parentGroup;
}
return rootGroup;
}
(来自)
我觉得必须有一个标准的功能模式,逻辑上等同于此,但我不确定它是什么。我使用以下方法提出了递归方法:
但似乎应该有一种不需要显式递归的方法来实现这一点,特别是在像Java这样没有尾部调用优化的语言中(我正在想象一种类似于foldLeft()
但在迭代计算的值流上,如果有意义的话?)
这里的标准函数方法是什么?Stream.iterate+过滤应该做到这一点:
Stream.iterate(leaf, ThreadGroup::getParent)
.filter(g -> g.getParent() == null)
.findFirst().get();
这是因为过滤器确保我们只迭代到根,然后在NPE之前停止?是的。正是这样。如果树为空,则抛出NosTouchElementException。是否可能将
.findFirst().get()
替换为.headOption()
,并可能添加.filter(Objects::nonNull)
?
Stream.iterate(leaf, ThreadGroup::getParent)
.filter(g -> g.getParent() == null)
.findFirst().get();