Unverständnis Lamda Expressions

Mika34

Bekanntes Mitglied
Hallo,

Ich verstehe gerade den Sinn hinter Lambda Expressions zu begreifen und da ist mir ein bestimmter Fall ins Auge gestochen, bei dem ich nicht weiß wie ich das ins "Normale" umschreiben kann.
Perse geht es um:
Code:
computeIfAbsent(Card, x -> new ArrayList<>()).isEmpty();
Wie wäre das in diesem Beispiel anzugehen, wenn man Lambda Expressions nicht verwendet?
 

httpdigest

Top Contributor
Eine Lambdafunktion kann generell immer durch das Instanziieren einer Klasse, die das geforderte "Single-Abstract-Method" (SAM) Ziel-Interface implementiert, ersetzt werden. Diese Klasse darf auch eine anonyme Klasse sein.
Welches Interface die Klasse implementieren muss, hängt von der Signatur der Methode ab, für deren Parameter du eine Lambda-Funktion als Argument verwendest.
Die Methode "computeIfAbsent" gibt es z.B. in dem Interface `java.util.Map` und dort hat sie die Signatur:
Java:
computeIfAbsent(K key, java.util.function.Function<? super K, ? extends V> mappingFunction)
Heißt also, wir brauchen eine Implementierung des `java.util.function.Function` Interfaces.
Beispiel:
Java:
java.util.Map<Integer, String> map = new java.util.HashMap<>();
String zahl = map.computeIfAbsent(1, new java.util.Function<>() {
  @Override
  public String apply(Integer t) {
    return "eins";
  }
});
 

Ullenboom

Bekanntes Mitglied
Was ich häufig mache: eine Variable als Zwischenspeicher, dann kann man die Typen gut ablesen:

Code:
Function<In, Out> function = x -> ...;
map.computeIfAbsent( .., function )

Wenn es dir hilft, kannst du mit regulären Klassenimplementierungen anfangen und später auf Lambda-Ausdrücke mit der IDE automatisch konvertieren. Das geht in beiden Richtungen.
 

Ähnliche Java Themen


Oben