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.
-
Ressourcen in Java
In der Funktion
Main#getResourceAsStream
soll eine Textdatei alsInputStream
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". -
Einlesen von Textdateien
In der Funktion
Main#resources
wird eine Textdatei im Ressourcen-Ordner über eine interne Hilfsfunktion (siehe vorige Teilaufgabe) alsInputStream
zum Einlesen geöffnet. Über einenBufferedReader
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.