Java 树遍历与一阶函数

Java 树遍历与一阶函数,java,generics,tree,traversal,higher-order-functions,Java,Generics,Tree,Traversal,Higher Order Functions,假设我有一个树类和一个节点类 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;

假设我有一个树类和一个节点类

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;
        ...
    }
}

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);
   }
});

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

这是一个很好的场景,闭包很有帮助。Java还没有提供闭包支持。所以Jiri的答案是好的。
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);
   }
});