Blatt 06: Stream-API (Git Remote, Streams)

(1 Punkt)

A06.1: Git: Pull-Requests (und Code-Formatierung und -Dokumentation) (20%)

Forken Sie das "Stream-API"-Repo und erzeugen Sie eine lokale Arbeitskopie von Ihrem Fork.

Sie finden die Vorgaben für jede Teilaufgabe in einem eigenen Branch. Checken Sie diese Branches lokal als Tracking-Branches aus und bearbeiten Sie die Teilaufgaben jeweils in ihrem eigenen Branch. Pushen Sie Ihre Änderungen in Ihren Fork zurück und erstellen Sie dort je einen Pull-Request auf Ihren eigenen master-Branch.

Bitte lassen Sie die Pull-Requests bis zur Vorstellung im Praktikum offen.

Achten Sie darauf, alle Schritte nachvollziehbar in Ihrer Arbeitskopie per Git-Commit festzuhalten. Demonstrieren Sie im Praktikum, wie Sie mit den Pull-Requests arbeiten.

Ihr Code soll einheitlich formatiert und dokumentiert sein. Sie können beides prüfen: ./gradlew spotlessCheck für die Formatierung und ./gradlew checkstyleMain für die Dokumentation1 mit Javadoc.2 Während Sie die Dokumentation bei Fehlern manuell anpassen müssen (siehe Lektion “Javadoc”), können Sie mit ./gradlew spotlessApply den Code automatisch formatieren lassen - tun Sie das am besten vor jedem Commit.

Stream-API

A06.2: Stream-API: Task I (10%)

Betrachten Sie den Branch task_i. Sie finden im Package streamapi einige Hilfsklassen sowie in der Datei Main.java einen Starter für diese erste Teilaufgabe.

In der Funktion Main#students wird für eine Liste von Student-Objekten die Summe der gesammelten ECTS berechnet.

Schreiben Sie den Body dieser Methode so um, dass die selbe Funktionalität unter Nutzung der Java-Stream-API erreicht wird. Bevorzugen Sie dabei nach Möglichkeit Methoden-Referenzen vor Lambda-Ausdrücken.

A06.3: Stream-API: Task II (10%)

Betrachten Sie nun den Branch task_ii. Sie finden wieder im Package streamapi einige Hilfsklassen sowie in der Datei Main.java einen Starter für diese zweite Teilaufgabe.

In der Funktion Main#ifmCps wird für eine Liste von Student-Objekten die Menge der gesammelten ECTS bestimmt. Dabei werden nur Studierende des Informatik-Studiengangs berücksichtigt.

Was bedeutet "die Menge der gesammelten ECTS", was ist die Mengen-Eigenschaft?

Schreiben Sie den Body dieser Methode so um, dass die selbe Funktionalität unter Nutzung der Java-Stream-API erreicht wird. Bevorzugen Sie dabei nach Möglichkeit Methoden-Referenzen vor Lambda-Ausdrücken.

A06.4: Stream-API: Task III (20%)

Betrachten Sie nun den Branch task_iii. Sie finden wieder im Package streamapi einige Hilfsklassen sowie in der Datei Main.java einen Starter für diese dritte Teilaufgabe.

In der Funktion Main#random werden zunächst zehn zufällige Integerwerte im Bereich zwischen 0 (inklusive) und 10 (exklusive) berechnet. Anschließend werden diese Zahlen weiter verarbeitet und das Ergebnis zurückgeliefert.

Schreiben Sie den Body dieser Methode so um, dass die selbe Funktionalität unter Nutzung der Java-Stream-API erreicht wird. Bevorzugen Sie dabei nach Möglichkeit Methoden-Referenzen vor Lambda-Ausdrücken.

A06.5: Stream-API: Task IV+V (40%)

(Verteilung: 20%, 20%)

Betrachten Sie nun den Branch task_iv_v. Sie finden wieder im Package streamapi einige Hilfsklassen sowie in der Datei Main.java einen Starter für diese vierte Teilaufgabe.

  1. Ressourcen in Java

    In der Funktion Main#getResourceAsStream soll eine Textdatei als InputStream zum Einlesen geöffnet werden. Die Datei soll dabei im Ressourcen-Ordner des Projekts gesucht werden.

    Informieren Sie sich im Web über den Umgang in Java mit Ressourcen. Welcher Ordner wurde in der vorgegebenen Gradle-Konfiguration als Ressourcen-Ordner für das Projekt definiert?

    Schreiben Sie den Body dieser Methode so um, dass die zu dem übergebenen Dateinamen passende Ressource im Kontext der aktuellen Klasse als InputStream geöffnet wird und geben Sie diesen als Ergebnis zurück.

    Hinweis: Diese Teilaufgabe ist die Voraussetzung für die Bearbeitung der nächsten Teilaufgabe. Wenn Sie diese Aufgabe nicht hinbekommen sollten, dann definieren Sie sich ersatzweise einen Text Block (Multi-line String) mit dem Inhalt der Textdatei und erzeugen daraus einen InputStream. Das zählt dann aber nicht als "bearbeitet".

  2. Einlesen von Textdateien

    In der Funktion Main#resources wird eine Textdatei im Ressourcen-Ordner über eine interne Hilfsfunktion (siehe vorige Teilaufgabe) als InputStream zum Einlesen geöffnet. Über einen BufferedReader werden alle Zeilen eingelesen und anschließend alle Zeilen, die mit dem Buchstaben "a" beginnen und mindestens zwei Zeichen lang sind, wieder zusammen gefügt (mit einem Zeilenumbruch \n als Trenner).

    Schreiben Sie den Body dieser Methode so um, dass die selbe Funktionalität unter Nutzung der Java-Stream-API erreicht wird. Bevorzugen Sie dabei nach Möglichkeit Methoden-Referenzen vor Lambda-Ausdrücken.

A06.6: Bonus-Aufgaben (+5%)

Machen Sie aus der Klasse streamapi.Student eine Record-Klasse.


  1. zumindest für den syntaktischen Aspekt ... ↩︎

  2. Sie können auch beides zusammen per ./gradlew check prüfen lassen. ↩︎