Java 8 Lambdas Rekursiv aufrufen

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein kleines Beispiel wie man eine rekursive Lambda Expression definieren kann - dies ist eher eine Spielerei ;-)
Der Trick zur Rekursiven Referenzierung innerhalb einer lambda Expression ist das entsprechende Feld "voll" zu qualifizieren.

Java:
package de.tutorials.training.lambda;

import java.util.function.UnaryOperator;

/**
* @author Thomas Darimont
*/
public class RecursiveLambdaExample {

    UnaryOperator<Integer> instanceFac = i -> i == 0 ? 1 : i * this.instanceFac.apply( i - 1);
    static UnaryOperator<Integer> staticFac = i -> i == 0 ? 1 : i * RecursiveLambdaExample.staticFac.apply( i - 1);

    public static void main(String[] args) {
        new RecursiveLambdaExample().demo();
    }

    private void demo() {

        System.out.println(instanceFac.apply(5));

        System.out.println(staticFac.apply(5));

        UnaryOperator<Integer>[] arrayFac = new UnaryOperator[1];
        arrayFac[0] = i -> i == 0 ? 1 : i * arrayFac[0].apply( i - 1);
        System.out.println(arrayFac[0].apply(5));
    }
}

Gruß Tom
 
Zuletzt bearbeitet:
Hallo Tom,

anscheinend geht das auch ohne Array: http://www.lambdafaq.org/can-lambda-expressions-be-used-to-define-recursive-functions/ siehe unteren Beitrag.

Aber eine schönere Syntax hätte ich mir trotzdem gewünscht :)
 
Zuletzt bearbeitet:
Hallo,

das Beispiel (wie leider auch viele andere) aus der LambdaFAQ funktioniert so nicht... da stehen schon 2 Kommentare von mir unten auf "Waiting for Moderation" ;-)
If one wants to refer to fields that refer to a lambda expression, then one has to reference the field via this.lambdaField in case of an instance field or SomeClass.lambdaField in case of a static field. Other references References will result in a compiler error, intellij will report: “java: self-reference in initializer”

Gruß Tom
 
Zurück