2 回答
![?](http://img1.sycdn.imooc.com/545863e80001889e02200220-100-100.jpg)
TA贡献1874条经验 获得超12个赞
在java中,接口的方法总是公开的。所以你的界面可以变成
@FuctionalInterface
public interface NodeOperation {
boolean forAll(Tree node);
}
所以你写了这行代码
NodeOperation overTwenty = (node) -> node.getValue() < 20;
Wich 会为您创建一个接口实例,用于检查节点的值是否低于 20
因此,假设您有一个值为 30 的 Tree 节点实例,如果您调用
overTwenty.forAll(node) //will return false
这个函数不是递归的。如果要将函数应用于节点的所有子节点,则必须在 Tree 类上编写递归方法
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
此方法将递归应用 Node 操作,因此将检查 Tree 中的所有元素是否与您的函数匹配
![?](http://img1.sycdn.imooc.com/54584ed2000152a202200220-100-100.jpg)
TA贡献1869条经验 获得超4个赞
您创建的overTwenty
对象是一个函数。如果要在树的节点中使用它,则必须在树的节点上调用它的唯一方法。例如,您可以这样称呼它:
boolean result = overTwenty.forAll(root);
顺便说一句,您的NodeOperation
interface 与 a 非常等价,Function<Tree, Boolean>
只是它返回的是原语boolean
而不是 class Boolean
。
添加回答
举报