(Java) 使用从二叉树输出布尔值的函数式(类谓词)接口

(Java) Use functional (predicate-like) interface that outputs boolean value from Binary Tree

我有点麻烦: 我构建了一个二叉树 class,其中包含一些函数,这些函数对于此任务而言并不重要。每个节点都存储一个左右子节点和一个父节点。每个节点都有一个键值,可以看作是一个标签。 我创建了 3 classes:

Tree.java是节点的class。

BinaryTree.java 包含一些与整棵树相关的方法,例如 min/max 值。

Main.java 测试树的功能并包含主要方法。

我的问题: 我想用一个方法编写一个功能接口,该方法获取一个节点作为参数并输出一个布尔值。这可用于传入 Root 节点并递归检查树中的每个节点是否大于或小于某个值。但是,我对函数式接口完全陌生,我无法真正理解函数背后的逻辑。这是我到目前为止得到的:

@FunctionalInterface

public interface NodeOperation {
    public abstract boolean forAll(Tree node);
}

NodeOperation overTwenty = (node) -> node.getValue() < 20;

当我尝试使用 lambda 表示法时,它不会 return 当我想要打印 overTwenty 时,我是一个布尔值。有人可以帮助我实现功能接口并向我解释如何访问布尔变量,以便我可以开始考虑如何为每个节点递归执行此操作。

如果你对二叉树了解不多,我建议你在维基百科上查一下。在我的例子中,我制作了一个 BST(二进制搜索树),这意味着它的结构是基于较大的值在右边,较小的值在左边。如果您需要我代码的某些特定部分,请提出建议,我会在此处 post :)

您创建的overTwenty对象是一个函数。如果你想在你的树的一个节点中使用它,你必须在你的树的一个节点上调用它的唯一方法。例如,您可以这样称呼它:

boolean result = overTwenty.forAll(root);

顺便说一句,你的 NodeOperation 接口与 Function<Tree, Boolean> 相当,只是它 returns 是原始的 boolean 而不是 [=20] =] Boolean.

在 java 中,接口的方法总是 public。这样你的界面就可以变成

@FuctionalInterface
    public interface NodeOperation {
        boolean forAll(Tree node);
    }

所以你写了这行代码

NodeOperation overTwenty = (node) -> node.getValue() < 20;

Wich 会为您创建一个接口实例,用于检查节点的值是否低于 20

假设您有一个值为 30 的树节点实例 如果你打电话给

 overTwenty.forAll(node) //will return false

这个函数不是递归的。如果要将函数应用于节点的所有子节点,则必须在树上编写递归方法 class

   public class Tree{
       ... 
    public boolean recursiveNodeOperation(NodeOperation operation) {
       if(!operation.forAll(this)) return false;
       for(Tree child : children) 
            if(! child.recursiveNodeOperation(operation)) 
                return false
       return true ;

      } 
    } 



root.recursiveNodeOperation(overTwenty); //will return true if all the nodes of the Tree starting from root are lower than 20

此方法将递归地应用节点操作,因此将检查树中的所有元素是否与您的函数匹配