2016-11-06 95 views
1

我學習了學習Java 8的lambda表達式,這是通用的N數組樹實現。我有一個遞歸函數來獲取節點中存在的節點總數我很震驚。遞歸函數調用轉換爲樹實現中的lambda表達式java

public class GenericTree<T> { 

private GenericTreeNode<T> root; 

public GenericTree() { 
    super(); 
} 

public GenericTreeNode<T> getRoot() { 
    return this.root; 
} 

public void setRoot(GenericTreeNode<T> root) { 
    this.root = root; 
} 

public int getNumberOfNodes() { 
    int numberOfNodes = 0; 

    if(root != null) { 
     numberOfNodes = getNumberOfnodeRecursiveFunc(root) + 1; //1 for the root! 
    }   

    return numberOfNodes; 
} 

private int getNumberOfnodeRecursiveFunc(GenericTreeNode<T> node) { 
    Integer numberOfNodes = node.getNumberOfChildren(); 

    for(GenericTreeNode<T> child : node.getChildren()) { 
     numberOfNodes += getNumberOfnodeRecursiveFunc(child); 
    }   

    //node.getChildren().stream().map(child ->this.getNumberOfnodeRecursiveFunc(child)); 

    //return node.getNumberOfChildren() + node.getChildren().stream().collect(Collectors.summingInt(GenericTree::getNumberOfnodeRecursiveFunc));   
}} 

如何使用lambda表達式遞歸以獲得節點的數量,而不是使用的代碼片段中提到的常規方法的?

注:本人通過多個其他問題去了,他們提供簡單的階乘expression.So請提供此

+0

你打?通過什麼方式?你似乎認爲那裏有一個問題,但我沒有看到一個問題。 –

+0

道歉...如果我的短語不提示...問題是如何遞歸地使用lambda表達式來獲取節點數量,而不是使用代碼片段中提到的傳統方法。 – karthik

回答

1

假設你的問題的一些更深入的瞭解是如何「翻譯」 getNumberOfnodeRecursiveFunc到lambda表達式(代碼似乎是正確的,所以我想這是你問),一個可能的解決方案可能是:

private int getNumberOfnodeRecursiveFunc(GenericTreeNode<T> node) { 
     return node.getNumberOfChildren() + node.getChildren().stream().collect(Collectors.summingInt(Test::getNumberOfnodeRecursiveFunc)); 
    } 

你不得不改變Test到類的適當的名稱,以使該方法的參考工作。

使用collect進行縮減並獲得樹中的節點數。

我想這就夠了。

UPDATE

爲了解決這個編譯器錯誤,您可以嘗試兩種方法:

  • 使得getNumberOfnodeRecursiveFunc靜態的(我猜是不是一種選擇)
  • 替代物的方法參考由lambda。

    private int getNumberOfnodeRecursiveFunc(MyNode node) { 
        return node.getNumberOfChildren() + node.getChildren().stream().collect(Collectors.summingInt(n - > getNumberOfnodeRecursiveFunc(n))); 
    } 
    
+0

感謝您的回覆。但是錯誤指出它無法對GenericTree類型的非靜態方法getNumberOfnodeRecursiveFunc(GenericTreeNode)進行靜態引用。 – karthik

+1

@karthik不客氣。我用一個可能的解決方案更新了答案,希望它對你有用 – acontell

+0

編輯效果很好。謝謝 – karthik