studyklar
GdI 2 · Übungsblatt 9 · Aufgabe 3

Verkaufsstatistik mit einem Stream: filtern, in Euro umrechnen, ausgeben

Neun Verkäufe aus fünf Ländern, in drei Währungen. Gesucht sind nur Kleidungsstücke aus Großbritannien, Österreich und der Schweiz, alle in Euro. Ein Stream lässt die Verkäufe wie auf einem Fließband durch mehrere Stationen laufen. Jede Station ist ein kurzes Lambda. Rechts steht das Hauptprogramm, die Zeilen zum Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 3

Gegeben sind die Klassen Verkauf und Verkaufsstatistik. In der main-Methode von „Verkaufsstatistik“ werden einige Verkaufsobjekte angelegt und in der Liste „verkaufsliste“ gespeichert.

Erzeugen Sie aus der Liste einen Stream. Machen Sie damit Folgendes:

  1. Filtern Sie die Verkäufe nach Ländern, so dass nur Verkäufe aus Großbritannien, Österreich und der Schweiz berücksichtigt werden.
  2. Filtern Sie die Verkäufe so, dass nur Kleidung berücksichtigt wird (Die Kategorien Schuhe, Hemden, Kleider).
  3. Rechnen Sie bei den Verkäufen, die die Währung GBP oder CHF haben, die Summe in Euro um. Anschließend sollen alle noch vorhandenen Verkäufe die Euro-Summe und die Währung „EUR“ enthalten.
  4. Geben Sie die noch vorhandenen Verkäufe auf der Konsole aus.

Verwenden Sie jeweils die geeigneten Stream-Operationen und erstellen Sie benötigten Lambdas.

Für Punkt 3 können Sie die Operation „map“ verwenden. Das hierfür genutzte Lambda soll jeweils ein neues Verkaufsobjekt erzeugen, in das die Kategorie und das Land aus dem vorhandenen Verkaufsobjekt kopiert werden sowie die bei der Umrechnung ermittelte Euro-Summe und die Währung „EUR“ eingetragen werden.

Damit die Lambdas nicht zu groß und zu unübersichtlich werden, können Sie deren Inhalte auch in eigenen Methoden auslagern und in den Lambdas diese Methoden aufrufen.

Die Klassen Verkauf und Verkaufsstatistik liegen uns nicht vor. Wir schreiben sie knapp selbst. Die neun Verkäufe sind ein eigenes Beispiel. Die Kurse stehen nicht in der Aufgabe; wir nehmen die aus der Musterlösung: 1 GBP (britisches Pfund) = 1,19 Euro und 1 CHF (Schweizer Franken) = 1,04 Euro.

Merke: Ein Stream hat drei Arten von Operationen. Eine erzeugt ihn (stream()), beliebig viele verarbeiten ihn (filter, map), eine schließt ihn ab (forEach).
  1. Aus der Liste einen Stream machen.
  2. Nach Ländern filtern, dann nach Kategorien.
  3. Jeden Verkauf durch eine Kopie in Euro ersetzen.
  4. Die übrigen Verkäufe ausgeben.

Die Klasse Verkauf

public class Verkauf {     private String kategorie;    private String land;    private double summe;    private String waehrung;     public Verkauf(String kategorie, String land, double summe, String waehrung) {        this.kategorie = kategorie;        this.land = land;        this.summe = summe;        this.waehrung = waehrung;    }     public String getKategorie() {        return kategorie;    }     public String getLand() {        return land;    }     public double getSumme() {        return summe;    }     public String getWaehrung() {        return waehrung;    }
    @Override    public String toString() {        return kategorie + ", " + land + ": " + summe + " " + waehrung;    }}

Ein Verkauf hat eine Kategorie (etwa „Schuhe“), ein Land, eine Summe und eine Währung. Alle vier Attribute sind private, ein getter liefert jedes. Unser toString druckt einen Verkauf als „Hemden, Schweiz: 39.9 CHF“.

Die Klasse bekommt später noch eine Methode zum Umrechnen in Euro. Sie kommt in Schritt 6 dazu, dort, wo wir sie brauchen.

Aus Blatt 5, Aufgabe 1 („Eine eigene Klasse Tier mit Konstruktor und toString“): Attribute sind private, der Konstruktor setzt sie, ein getter gibt einen Wert zurück. toString legt den Text für die Ausgabe fest.

Die Liste mit neun Verkäufen

import java.util.ArrayList;import java.util.List; public class Verkaufsstatistik {     public static void main(String[] args) {        List<Verkauf> verkaufsliste = new ArrayList<>();        verkaufsliste.add(new Verkauf("Schuhe", "Deutschland", 89.90, "EUR"));        verkaufsliste.add(new Verkauf("Hemden", "Großbritannien", 45.00, "GBP"));        verkaufsliste.add(new Verkauf("Kleider", "Schweiz", 120.00, "CHF"));        verkaufsliste.add(new Verkauf("Taschen", "Österreich", 60.00, "EUR"));        verkaufsliste.add(new Verkauf("Schuhe", "Österreich", 75.50, "EUR"));        verkaufsliste.add(new Verkauf("Kleider", "Frankreich", 99.00, "EUR"));        verkaufsliste.add(new Verkauf("Schuhe", "Großbritannien", 64.99, "GBP"));        verkaufsliste.add(new Verkauf("Uhren", "Schweiz", 250.00, "CHF"));        verkaufsliste.add(new Verkauf("Hemden", "Schweiz", 39.90, "CHF"));
Nr.KategorieLandSummeWährung
1SchuheDeutschland89,90EUR
2HemdenGroßbritannien45,00GBP
3KleiderSchweiz120,00CHF
4TaschenÖsterreich60,00EUR
5SchuheÖsterreich75,50EUR
6KleiderFrankreich99,00EUR
7SchuheGroßbritannien64,99GBP
8UhrenSchweiz250,00CHF
9HemdenSchweiz39,90CHF

main legt die Liste verkaufsliste an und füllt sie mit neun Verkäufen. Die Beispiele sind so gewählt, dass jeder Filter etwas aussortiert: zwei Länder fallen heraus, zwei Kategorien auch.

Aus Blatt 7, Aufgabe 1 („Zwei Listen im Reißverschluss zusammenfügen“): List<Verkauf> ist eine Liste mit Elementen vom Typ Verkauf. new ArrayList<>() legt sie leer an, add hängt ein Element an.
Noch 6 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Verkaufsstatistik.java

Liste und Stream

Abbildung 1Verkaufsstatistik.java

Liste und Stream

import java.util.ArrayList;import java.util.List; public class Verkaufsstatistik {     public static void main(String[] args) {        List<Verkauf> verkaufsliste = new ArrayList<>();        verkaufsliste.add(new Verkauf("Schuhe", "Deutschland", 89.90, "EUR"));        verkaufsliste.add(new Verkauf("Hemden", "Großbritannien", 45.00, "GBP"));        verkaufsliste.add(new Verkauf("Kleider", "Schweiz", 120.00, "CHF"));        verkaufsliste.add(new Verkauf("Taschen", "Österreich", 60.00, "EUR"));        verkaufsliste.add(new Verkauf("Schuhe", "Österreich", 75.50, "EUR"));        verkaufsliste.add(new Verkauf("Kleider", "Frankreich", 99.00, "EUR"));        verkaufsliste.add(new Verkauf("Schuhe", "Großbritannien", 64.99, "GBP"));        verkaufsliste.add(new Verkauf("Uhren", "Schweiz", 250.00, "CHF"));        verkaufsliste.add(new Verkauf("Hemden", "Schweiz", 39.90, "CHF"));         verkaufsliste.stream()                .filter(verkauf -> verkauf.getLand().equals("Großbritannien")                        || verkauf.getLand().equals("Österreich")                        || verkauf.getLand().equals("Schweiz"))                .filter(verkauf -> verkauf.getKategorie().equals("Schuhe")                        || verkauf.getKategorie().equals("Hemden")                        || verkauf.getKategorie().equals("Kleider"))                .map(verkauf -> verkauf.erzeugeKopieMitEuro())                .forEach(System.out::println);    }}
LegendeDas ganze Hauptprogramm.