2016-11-06 6 views
1

Ich nahm eine Fallstudie für das Lernen Lambda-Ausdruck von Java 8, die generische N-Array Tree Implementation.Ich habe eine rekursive Funktion, um die Gesamtzahl der Knoten in der Baum. Ich bin an diesem Punkt betroffen.Rekursive Funktionsaufruf Umwandlung in Lambda-Ausdruck in Tree Implementierung 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));   
}} 

Wie Lambda-Ausdruck verwenden rekursiv die Anzahl der Knoten zu erhalten, anstatt den herkömmlichen Ansatz in dem Code-Schnipsel erwähnt zu verwenden?

Hinweis: ich durch mehrere andere Fragen ging, sie bieten einfache faktorielle expression.So bitte einen tieferen Einblick in dieses

+0

Sie getroffen werden? Womit? Sie scheinen zu denken, dass da eine Frage drinnen ist, aber ich sehe keine. –

+0

Entschuldigung ... wenn meine Formulierung nicht prompt ist ... Die Frage ist, wie man Lambda-Ausdruck rekursiv verwendet, um die Anzahl der Knoten zu erhalten, anstatt den im Code-Snippet erwähnten konventionellen Ansatz zu verwenden. – karthik

Antwort

1

Ihre Frage Unter der Annahme liefern ist, wie man getNumberOfnodeRecursiveFunc zu lambdas „übersetzen“ (der Code korrekt scheint so ich denke, es ist, was Sie fragen), könnte eine mögliche Lösung sein:

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

Sie würden Test auf den entsprechenden Namen der Klasse, um das Verfahren Nachschlagewerk zu machen ändern.

Sie verwenden collect die Reduktion zu machen und die Anzahl der Knoten im Baum zu bekommen.

Ich denke, es wäre genug.

UPDATE

den Compiler-Fehler zu lösen, können Sie zwei Ansätze versuchen:

  • die Herstellung getNumberOfnodeRecursiveFunc statisch (ich denke, ist keine Option)
  • Substitute die Referenzmethode durch ein Lambda.

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

Danke für die Antwort. Aber der Fehler besagt, dass es einen statischen Verweis auf die nicht statische Methode getNumberOfnodeRecursiveFunc (GenericTreeNode) vom Typ GenericTree nicht möglich ist. – karthik

+1

@karthik Gern geschehen. Ich habe die Antwort mit einer möglichen Lösung aktualisiert, hoffen, dass es für Sie arbeitet – acontell

+0

Die Bearbeitungen well.thanks arbeitete – karthik