Lambda

Adriano10

Bekanntes Mitglied
Java:
public class üben {
    
    public static void main(String[] args){
        //Iterativ
        Potenz potenz = (int x, int y) -> {int result = 1;  for(int i = 0; i < y; i++) {result *= x;}
        return result;};     
                
        int result = potenz.potenz(5, 2);
        
        System.out.println(result);
        
        
        //Recursiv
        
        Potenz p = (int x, int y) -> {if(y == 0) return 1; else return x * p.potenz(x, y -1);}
    }
    
    interface Potenz{
        int potenz(int x, int y);
    }
}

Bei dem recursive Lambda meckert Compiler, was mache ich hier falsch.

Wie kann ich bei diesem Fall Recurion in Lambda verwenden, um ohne Fehler ausgeben zu lassen?
 
Das funktioniert nur, wenn du die Variable, der du die Lambda zuweist, als statische Klassenvariable oder Instanzvariable definierst. Z.B. so:
Java:
public class Test {
  private final Potenz p = (int x, int y) -> y == 0 ? 1 : x * this.p.potenz(x, y - 1);
}
 
Es geht auch ohne dieses nervige Interface...
Java:
	public static Function<Integer, Function<Integer, Function>> myTriFunction =
			x -> y -> f -> y == 0 ? 1 : x * (Integer) ((Function<Integer, Function<Integer, Function>>) f).apply(x).apply(y - 1).apply(f);
	public static BiFunction<Integer, Integer, Integer> myBiFunction =
			(x, y) -> (Integer) myTriFunction.apply(x).apply(y).apply(myTriFunction);
Java:
		System.out.println(myBiFunction.apply(3, 5));
243
 
Welches "Konstrukt"? Currying beschreibt die Transformation einer Funktion, die ein Argument als Tupel der Länge N bekommt, in eine Funktion, die N einzelne Parameter bekommt. Und Tupel gibt es in Java schonmal nicht.
Currying wird oft mit partieller Auswertung verwechselt, wahrscheinlich, weil die partielle Auswertung einer Funktion, die ein Tupel als Argument bekommt, erst via Currying möglich wird.
 

Zurück
Oben