java - 使用 lambda 表达式进行递归
问题描述
我在理解 lambda 表达式时遇到了一些麻烦。我的代码片段应该使用树的位置并使用代码进行遍历。我想我可能看错了方向。也许 lambda 表达式的逻辑或缺乏语法知识是阻止我做我想做的事的原因。任何帮助将不胜感激。在我的代码片段下面:
@Override
public void traverseInOrder(Consumer<Position<E>> visit) {
visit = p -> inOrder(p);
visit.accept(root);
}
private void inOrder(Position<E> p) throws InvalidPositionException {
BinaryTreeNode<E> t = (BinaryTreeNode<E>) p;
pt -> {
inOrder(t.left);
System.out.println(t.element());
inOrder(t.right));
};
}
解决方案
从“将访问者应用于节点及其所有子节点”开始,即:
private void inOrder(Consumer<E> visitor, BinaryTreeNode<E> node) {
if (node != null) { // some stop condition
// TODO traverse left subnode
// TODO visit actual element
// TODO traverse right subnode
}
}
这被称为:
@Override
public void traverseInOrder(Consumer<E> visitor) {
inOrder(visitor, root);
}
反过来,它可以被称为:
traverseInOrder(e -> System.out.println(e));
// or, same as above
traverseInOrder(System.out::println);
第一种方法应该很简单,例如:
private void inOrder(Consumer<E> visitor, BinaryTreeNode<E> node) {
if (node != null) {
inOrder(visitor, t.left);
visitor.apply(t.element);
inOrder(visitor, t.right);
}
}
松散地基于发布的代码,假设类型,未经测试
注1:如果使用java.util.function.Consumer
类,它应该是visitor.accept(t.element)
注意2:正如Clashsoft评论的那样,声明visitor
(两种方法)的正确方法是 as Consumer<? super E> visitor
。这意味着访问者是一个函数,它接受类型E
或任何超类型的参数E
(如Consumer<Object>
ifE
是 an Integer
)
推荐阅读
- ios - 如何在谷歌地图 Swift API 中实现颜色渐变?
- flutter - 在无状态类中制作有状态小部件
- r - 无法修改 ggplot2 x 轴标签
- python - 如何将 python 中的 KNN Scikit-learn 模型转换为 tensorflow lite 模型?
- node.js - 我们如何仅将 peer.js 用于一侧
- python - pyts 实现一维数据的 GAF
- android - 科尔多瓦问题构建android
- html - 如何将我的元素移动到页面的另一侧
- r - 无法将 scale_x_log10() 应用于我自己的 geom:它错误地出现在绘图上
- r - SankeyNetwork...如何处理添加的数据