2

假设我有一个 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 对象以提取信息。也许我想做一次来构建所有节点标签的字符串,因为它们被访问,另一次我想对 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拥有一个只进行遍历的函数,然后将一个高阶函数作为一个参数来处理收集我想要获取的任何类型的信息?或者有没有更好的方法来做到这一点,我没有想到?

4

1 回答 1

2

您可以将操作封装到 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);
   }
});

在 Java 8 中,有一种更好的方法可以使用闭包来做到这一点。

于 2013-06-26T23:07:49.440 回答