Skip to content

Lambda

Arten von Lambda Ausdrücken

InterfaceParameterRückgabeMethodennameVerwendung
RunnableKeinevoidrun()Threads, Tasks
Supplier<T>KeineTget()Lazy Init, Factory
Consumer<T>Tvoidaccept()forEach, Ausgabe
BiConsumer<T,U>T, Uvoidaccept()Map.forEach
Function<T,R>TRapply()map, Transform
BiFunction<T,U,R>T, URapply()compute, merge
Predicate<T>Tbooleantest()filter, Bedingungen
UnaryOperator<T>TTapply()replaceAll
BinaryOperator<T>T, TTapply()reduce, min, max

Syntax zum definieren eines Lamda Ausdrucks

Grundsyntax:

(Parameterliste) ->

Klammer um Parameter können weggelassen werden wenn es nur einen Parameter gibt und die Typen können auch weggelassen werden da sie vom Compiler erkannt werden können und wenn es nur eine Anweisung gibt können auch die geschweiften Klammern weggelassen werden

java
import java.util.List;
import java.util.function.Consumer;

Consumer<String> print = (String s) -> {
    System.out.println(s);
};

Consumer<String> print2 = s -> System.out.println(s);

// Man kann auch die Methodenreferenz verwenden 

Consumer<String> print3 = s -> System.out::println;

Wichtigsten Methoden um mit Lamdas zu arbeiten

forEach

Signatur:

java
public abstract void forEach(java.util.function.Consumer<? super T> action);

Bedeutet ein forEach nimmt einen Consumer als Parameter somit hat es einen Parameter T und keinen rückgabewert siehe die Tabelle oben

führt somit nur eine Aktion aus für jedes Element in dem Stream

java
List<String> list = List.of("a", "b", "c");
list.forEach(s -> System.out.println(s));
// Oder Kürzer 
list.forEach(System.out::println);

map

Signatur:

java
public abstract <R> Stream<R> map(java.util.function.Function<? super T,? extends R> mapper);

Bedeutet ein map nimmt eine Function als Parameter somit hat es einen Parameter T und einen Rückgabewert R siehe die Tabelle oben

führt somit eine umwandlung vor von T zu R für jedes Element in dem Stream aus und gibt einen neuen Stream zurück

Es ist auch möglich das T und R denn gleichen Typ haben dann spricht man von einem UnaryOperator siehe die Tabelle oben

java
List<String> list = List.of("a", "b", "c");
List<String> upperCaseList = list.stream().map(s -> s.toUpperCase()).toList();
// Oder Kürzer
List<String> upperCaseList2 = list.stream().map(String::toUpperCase).toList();

filter

Signatur:

java
public abstract Stream<T> filter(java.util.function.Predicate<? super T> predicate);

Bedeutet ein filter nimmt einen Predicate als Parameter somit hat es einen Parameter T und einen Rückgabewert boolean siehe die Tabelle oben führt somit eine bedingung für jedes Element in dem Stream aus und gibt einen neuen Stream zurück der nur die Elemente enthält die die Bedingung erfüllen

java
List<String> list = List.of("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.equals("a")).toList();
// Oder Kürzer
List<String> filteredList2 = list.stream().filter("a"::equals).toList();

Literatur