Fortgeschrittenes Java Tag 3: Streams, Lambda-Ausdrücke und funktionale Programmierung

Ziel dieses Tages

Heute lernst du:

Am Ende wirst du funktionale Programmierkonzepte in Java nutzen können, um Daten kompakt und effizient zu verarbeiten.

Schritt 1: Grundlegende Stream-Operationen

Streams erlauben es dir, Operationen auf Collections im funktionalen Stil auszuführen.


import java.util.*;
import java.util.stream.*;

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> even = numbers.stream()
                                .filter(n -> n % 2 == 0)
                                .collect(Collectors.toList());

even.forEach(System.out::println);

Schritt 2: Map und Reduce

Verwende map, um Elemente zu transformieren, und reduce, um Ergebnisse zu kombinieren.


int sumOfSquares = numbers.stream()
                          .filter(n -> n % 2 != 0) // ungerade Zahlen
                          .map(n -> n * n)         // quadrieren
                          .reduce(0, Integer::sum); // summieren
System.out.println("Summe der Quadrate ungerader Zahlen: " + sumOfSquares);

Schritt 3: Parallele Streams

Parallele Streams können die Leistung bei großen Datenmengen verbessern, indem sie Elemente gleichzeitig verarbeiten.


int sumParallel = numbers.parallelStream()
                         .filter(n -> n % 2 != 0)
                         .map(n -> n * n)
                         .reduce(0, Integer::sum);

System.out.println("Parallele Summe: " + sumParallel);

Schritt 4: Lambda-Ausdrücke mit Collections

Lambdas bieten eine kurze Möglichkeit, Verhalten an Collection-Methoden zu übergeben.


numbers.forEach(n -> System.out.println(n * 2));

Schritt 5: Methodenreferenzen

Methodenreferenzen sind eine Kurzform für Lambdas, die eine bestehende Methode aufrufen.


numbers.forEach(System.out::println);

Übung


import java.util.*;
import java.util.stream.*;

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> even = numbers.stream()
                                .filter(n -> n % 2 == 0)
                                .collect(Collectors.toList());

even.forEach(System.out::println);

Aufgabe

Verwende Streams, um die Summe der Quadrate aller ungeraden Zahlen in einer Liste zu berechnen.

Schritte:

Beispiel:


import java.util.*;
import java.util.stream.*;

public class SumSquaresOdd {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

        int sumOfSquares = numbers.stream()
                                  .filter(n -> n % 2 != 0)
                                  .map(n -> n * n)
                                  .reduce(0, Integer::sum);

        System.out.println("Summe der Quadrate ungerader Zahlen: " + sumOfSquares);
    }
}