树遍历和一阶函数



假设我有一个Tree类和一个Node类

public class Tree{
    private Node root;
    public Tree(Node root){ this.root = root; }
}
public class Node{
    private ArrayList<Node> children;
    private Node parent;
    private String label;
    private String someInfo;
    private int someIntegerInfo;
    private MyObject someObject;   // Where MyObject is from some other class
    ...
    public Node(Node parent, ArrayList<Node> children, String label, String foo, ...){
        this.parent = parent;
        this.children = children;
        this.someInfo = foo;
        ...
    }
}

现在假设我需要对这些Tree对象进行深度优先遍历以提取信息。也许我想做一次,在访问时构建一个所有Node标签的字符串,另一次我想对int字段等执行一些操作。

当我编写这些遍历时,我当然注意到我正在编写相同的代码来一遍又一遍地进行遍历,但在节点上执行不同的操作或返回不同的类型。

public something traverse(Node node, something foo){
    // Do some stuff with foo here
    ...
    for( Node child: node.getChildren() ){
        return child.traverse();
    }
    return foo;
}

Java有没有一种方法可以让一个函数只进行遍历,然后将一个更高阶的函数作为一个参数,处理收集我试图获得的任何类型的信息?或者有没有更好的方法可以做到这一点,我没有想过?

您可以将操作封装到Java类中:

public interface NodeOperation {
   void perform(Node node);
}
public void traverse(Node node, NodeOperation op) {
    op.perform(node);
    for(Node child: node.getChildren()) {
        traverse(child, op);
    }
}
//then for performing the operation during the traversal call following code
traverse(node, new NodeOperation() {
   perform(Node node) {
      // do whatever you want
      node.setSomeIntegerInfo(node.getSomeIntegerInfo() * 42);
   }
});

在Java8中,有一种更好的方法可以使用闭包来实现这一点。

最新更新