# Nachdenkzettel: Streams

Betrachten Sie folgenden Code:

```java
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo {

	public static void main(String[] args) {
		List<String> names = List.of(
			"Anna",
			"Bernd",
			"Clara",
			"David",
			"Eva"
		);

		Stream<String> stream = names.stream()
			.filter(name -> {
				System.out.println("filter: " + name);
				return name.length() <= 4;
			})
			.map(name -> {
				System.out.println("map: " + name);
				return name.toUpperCase();
			});

		System.out.println("before count");
		long count = stream.count();
		System.out.println("count: " + count);

		System.out.println("before forEach");
		stream.forEach(System.out::println);

		System.out.println("done");
	}
}
```

### 1. Programmverständnis

Führen Sie das gegebene Programm aus.

- Beschreiben Sie präzise, was Sie beobachten.
- Beschreiben Sie, welche Stream-Operationen ausgeführt werden und wann sie ausgeführt werden.
- Recherchieren Sie, wie man `filter`, `map`, `count` und `forEach` in Bezug auf Streams nennt.
- Begründen Sie, warum das Programm dieses Verhalten zeigt.
- Erklären Sie insbesondere, warum nicht alle Ausgaben erscheinen, die man auf den ersten Blick erwarten könnte.

### 2. Korrektur

Verändern Sie den Code so, dass das beobachtete Problem nicht mehr auftritt.

- Die grundlegende Struktur bleibt erhalten: Eine Liste von Namen wird mit `filter` und `map` verarbeitet.
- Das Programm soll zuverlässig terminieren.
- Die gefilterten und umgewandelten Namen sollen ausgegeben werden.
- Zusätzlich soll die Anzahl dieser Namen ausgegeben werden.
- Begründen Sie Ihre Änderung.
