Hilfe. Generics und BiFunctions

stefan_jj

Mitglied
Hallo liebe Community,

ich habe folgendes Problem. Und zwar blicke ich generell noch immer nicht ganz bei Generics durch.

Die unten angeführte Methode soll Einträge in Gruppen einteilen. Sie verwendet zwei Funktionsparameter:
Der erste Funktionsparameter groupingFn berechnet aus den Keys und Werten der Einträge einen Wert (von Typ G) für die Gruppierung.
Der zweite Funktionsparameter valueFn berechnet dann den Wert (von Typ R), der in die Gruppierung aufgenommen werden soll.
Ergebnis ist eine Map mit den Werten aus G für die Keys und Listen mit Werten von Typ R. Das heißt, für alle Einträge, die gleichen Gruppierungswert liefern, werden die Ergebnisse der Funktion valueFn in die entsprechende Liste aufgenommen.

Nun mein Problem ist, dass ich gerade etwas auf der Leitung stehe und nicht durchblicke wie ich die beiden Funktionsparameter aufrufen kann. (1x Key berechnen, 1x Wert berechnen) Genauer gesagt, ich verstehe nicht wie die Werte für die Gruppierungen berechnet werden können.

Eigentlich dürfte das ja nicht allzu schwer sein. Ich gehe davon aus, das sollte doch mit einer forEach-Schleife und den beiden Funktionsparameter-Aufrufen zu lösen sein.

Bei Bedarf kann ich auch das gesamte Interface reinstellen.

danke und lg.


Java:
    // group
    public default <G, R> Map<G, List<R>> group(BiFunction<? super K, ? super V, G> groupingFn,
            BiFunction<? super K, ? super V, R> valueFn) {
        Map<G, List<R>> resultMap = new ArrayMap<>();
        for (Entry<K, V> element : this) {
           ...
        }
    }
 

MoxxiManagarm

Top Contributor
Eine BiFunction ist nichts anderes als eine Funktion mit 2 Eingabewerten (In deinem Fall vom Typ K und V) und einem Rückgabewert (in deinem Fall einmal vom Typ G und einmal von Typ R).

Eine BiFunction ist z.B. das:
Java:
public static Integer addiereLaengeZweierStrings(String s1, String s2) {
  // ...
}

Diese Methode lässt sich so als BiFunction darstellen:
Java:
BiFunction<String, String, Integer> biFunc = (String s1, String s2) -> /* ... */;

Oder auch referenziert
Java:
BiFunction<String, String, Integer> biFunc = addiereLaengeZweierStrings;

Achtung, eine Klassen-Methode (non-static) hat ihre aufrufende Klasse auch als "Parameter"
Java:
class A {
  public B getB (A otherA) { // ist auch eine BiFunction<A, A, B>
    return /* ... */
  }
}

Ich gehe davon aus, dass K und V Key und Value Werte sind. Übergibst der group Methode für beide Parameter eine Funktion mit Key und Value als Parameter, die irgendeinen anderen Wert erzeugen und diesen dann entsprechend in die Map eintragen.

Beispiel
Du hast eine Mitarbeiterabfrage gemacht, wer welche Speise zur Weihnachtsfeier essen möchte. Du hast dann das (vermutlich Map-ähnliche) Objekt
Java:
DeineGenerischeKlasse<Mitarbeiter, Gericht> weihnachtsessen;

Der Mitarbeiter ist dein Key K und dein Gericht das Value V. Du brauchst nun 2 Methoden, die Mitarbeiter und Gericht "verbrauchen" und dazu einen neuen Wert generieren. Angenommen der Mitarbeiter hat eine Vorliebe zu Rotwein oder Weißwein. Das Gericht hat einen Rotwein und einen Weißwein zur Auswahl, welcher dann mit serviert wird. Du möchtest jetzt wissen welchen Wein (ist dann G) du für welche Mitarbeiter servieren möchtest (R = K // spricht nichts dagegen).

Java:
Map<Wein, List<Mitarbeiter>> weineServierenAn =  weihnachtsessen.group(
  (mitarbeiter, gericht) -> mitarbeiter.getVorliebeWein.equals("weiß") ? gericht.getWeißwein() : gericht.getRotwein(), // du extrahierst den Wein aus dem Gericht mit der Vorliebe des Mitarbeiters
  (mitarbeiter, gericht) -> mitarbeiter
);

Letztlich definierst du nur mit diesen Parametern wie du an die Werte für G und R kommst. Den Rest übernimmt ja die gezeigte Implementierung.
 
Zuletzt bearbeitet:

stefan_jj

Mitglied
Eine BiFunction ist nichts anderes als eine Funktion mit 2 Eingabewerten (In deinem Fall vom Typ K und V) und einem Rückgabewert (in deinem Fall einmal vom Typ G und einmal von Typ R).

Eine BiFunction ist z.B. das:
Java:
public static Integer addiereLaengeZweierStrings(String s1, String s2) {
  // ...
}

Diese Methode lässt sich so als BiFunction darstellen:
Java:
BiFunction<String, String, Integer> biFunc = (String s1, String s2) -> /* ... */;

Oder auch referenziert
Java:
BiFunction<String, String, Integer> biFunc = addiereLaengeZweierStrings;

Achtung, eine Klassen-Methode (non-static) hat ihre aufrufende Klasse auch als "Parameter"
Java:
class A {
  public B getB (A otherA) { // ist auch eine BiFunction<A, A, B>
    return /* ... */
  }
}

Ich gehe davon aus, dass K und V Key und Value Werte sind. Übergibst der group Methode für beide Parameter eine Funktion mit Key und Value als Parameter, die irgendeinen anderen Wert erzeugen und diesen dann entsprechend in die Map eintragen.

Beispiel
Du hast eine Mitarbeiterabfrage gemacht, wer welche Speise zur Weihnachtsfeier essen möchte. Du hast dann das (vermutlich Map-ähnliche) Objekt
Java:
DeineGenerischeKlasse<Mitarbeiter, Gericht> weihnachtsessen;

Der Mitarbeiter ist dein Key K und dein Gericht das Value V. Du brauchst nun 2 Methoden, die Mitarbeiter und Gericht "verbrauchen" und dazu einen neuen Wert generieren. Angenommen der Mitarbeiter hat eine Vorliebe zu Rotwein oder Weißwein. Das Gericht hat einen Rotwein und einen Weißwein zur Auswahl, welcher dann mit serviert wird. Du möchtest jetzt wissen welchen Wein (ist dann G) du für welche Mitarbeiter servieren möchtest (R = K // spricht nichts dagegen).

Java:
Map<Wein, List<Mitarbeiter>> weineServierenAn =  weihnachtsessen.group(
  (mitarbeiter, gericht) -> mitarbeiter.getVorliebeWein.equals("weiß") ? gericht.getWeißwein() : gericht.getRotwein(), // du extrahierst den Wein aus dem Gericht mit der Vorliebe des Mitarbeiters
  (mitarbeiter, gericht) -> mitarbeiter
);

Letztlich definierst du nur mit diesen Parametern wie du an die Werte für G und R kommst. Den Rest übernimmt ja die gezeigte Implementierung.

Ahaaaaa. Nun wird mir einiges klarer. Dh. in meinem Fall würde groupingFn den Schlüssel (key) der neuen Map liefern und valueFn die Werte der Liste. Sowohl groupingFn als auch valueFn können vom Typ K als auch vom Typ V sein (oder beides).

Beispiel.: Studenten - Klausurnote
Java:
gegeben ist eine Map mit <Student, Punkte>

Map<Student, Punkte>
K -> V:
Student -> Punkte

bspw.:
groupingFn: (*, Punkte) -> Note
valueFn: (Student, *) -> Student
Note -> List<Student> dh. Map<Note, List<Student>>

groupingFn: (Student, *) -> Student
valueFn: (*, Punkte) -> Note
Student -> List<Note> dh. Map<Student, List<Note>>

groupingFn: (*, Punkte) -> Punkte
valueFn: (*, Punkte) -> Note
Punkte -> List<Note> dh. Map<Punkte, List<Note>>
 

MoxxiManagarm

Top Contributor
Dh. in meinem Fall würde groupingFn den Schlüssel (key) der neuen Map liefern und valueFn die Werte der Liste.
Ja.

Sowohl groupingFn als auch valueFn können vom Typ K als auch vom Typ V sein (oder beides).
Beide Funktionen bekommeen sowohl K (Student) als auch V (Punkte) als Parameter. Unter Umständen wird einer dieser Parameter aber nicht verwendet. Das wird durch ein * in deiner weiteren Ausführung indiziert. (*, Punkte) -> Note sagt nur, dass nur die Punkte in Betracht gezogen werden um die Note zu generieren, nicht jedoch der Schüler. Der Schüler ist trotzdem Teil der BiFunction.
 

stefan_jj

Mitglied
Ja.


Beide Funktionen bekommeen sowohl K (Student) als auch V (Punkte) als Parameter. Unter Umständen wird einer dieser Parameter aber nicht verwendet. Das wird durch ein * in deiner weiteren Ausführung indiziert. (*, Punkte) -> Note sagt nur, dass nur die Punkte in Betracht gezogen werden um die Note zu generieren, nicht jedoch der Schüler. Der Schüler ist trotzdem Teil der BiFunction.

danke. Jetzt macht es Sinn =)
 

MoxxiManagarm

Top Contributor
Jetzt könnte man sich noch UseCases überlegen wo sowohl Punkte als auch Schüler Einfluss haben auf das Resultat. Eventuell bei Sport (Geschlecht des Schülers) oder so :D
 

stefan_jj

Mitglied
Ich hätte eine Frage zu deinem BiFunction-Beispiel.:

folgendes Szenario:
Java:
Map<String, List<Integer>> records = new ArrayMap<>();

records.put("Huber",   List.of( 8, 12, 22, 21, 20,  0, 17, 19,  3, 18, 16));


Ich möchte mithilfe einer LambdaExpression zählen wie oft Huber mehr wie 8 Punkte erreicht hat.
Java:
Map<String, Integer> nrSolved = records.map((x, y) -> x + y.filter(y.size() > 8));


folgende Methoden sollen benutzt werden.....
Java:
     /**
     * Returns a list with the elements of this list
     * which pass the test of the given predicate function.
     * @param predicate the test function
     * @return the list with the elements passing the test
     */
public default List<E> filter(Predicate<? super E> predicate) {
        List<E> result = createResultList();
        for (E e : this) {
            if (predicate.test(e)) {
                result.add(e);
            }
        }
        return result;
    }
    
    /**
     * Returns the number of elements of this list
     *
     * @return the number of elements
     */
public int size();

ich verstehe leider nicht ganz wie diese beiden Methoden benutzt werden müssen. Ich muss filter ja einen Wert mitgeben.
Nur bekomme ich leider immer einen Fehler.

lg
 

MoxxiManagarm

Top Contributor
Wie genau ist diese mapping Funktion implementiert? Das müsste man wissen um die Frage ganz genau beantworten zu können.

Ich verstehe leider nicht ganz wie diese beiden Methoden benutzt werden müssen. Ich muss filter ja einen Wert mitgeben.

Denke an die Seite, welche ich dir gelinkt habe. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/function/package-summary.html

Ein Predicate ist eine Funktion, welche einen Wert erhält (bei dir vom Typ E) und einen boolean (das ist fest für ein Predicate definiert) zurückgibt. Das hier wäre z.B. ein Predicate:
Java:
public static boolean istEineGeradeZahl(int n) {
  return n % 2 == 0;
}
Diese Funktion lässt sich auf diese Weise als Predicate in einem Parameter übergeben:
Java:
testeEineZahlAufEineEigenschaft((int n) -> n % 2 == 0);

y.size() > 8 ist bei dir nicht ausreichend. Denke daran, dass y die Liste ist. Du willst aber die Listenelemente testen. Das Predicate erhält als input das Listenelement. Es muss heißen y.filter((Integer element) -> element > 8). Das Ergebnis dieser Filterung sollte eine kleinere Liste sein, diese enthält die Elemente > 8. Die kannst du mit size() dann zählen, also: y.filter((Integer element) -> element > 8).size().
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
H pdf stempel - Hilfe erbeten Java Basics - Anfänger-Themen 6
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
F RegEx Hilfe Java Basics - Anfänger-Themen 5
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
S Hilfe bei Praktischen Aufgaben von Arrays Java Basics - Anfänger-Themen 39
U Ich bräuchte Hilfe Java Basics - Anfänger-Themen 1
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
Justin4687 Benötige Hilfe bei folgender Aufgabe Java Basics - Anfänger-Themen 2
aero043 Hilfe bei BlueJ Hausübung Java Basics - Anfänger-Themen 27
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
P Hilfe gesucht Java Basics - Anfänger-Themen 11
D Hilfe bei Calculator Test Java Basics - Anfänger-Themen 15
R Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
R Java Bücher hilfe Java Basics - Anfänger-Themen 9
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
I Scheduling: "Quartz" verwenden, Hilfe bei Umstellung Java Basics - Anfänger-Themen 3
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
Ekooekoo Hilfe spiel Java Basics - Anfänger-Themen 5
SpiritsHuner Hilfe!! Java Basics - Anfänger-Themen 16
Lacotto Java Kurs Aufgaben Hilfe Java Basics - Anfänger-Themen 14
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
Neuling47 Denkfehler? Hilfe Java Basics - Anfänger-Themen 11
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
X Erste Schritte Hilfe bei einem kleinen Spiel. Java Basics - Anfänger-Themen 19
D Bitte um Hilfe muss es schnellstmöglich erledigen Java Basics - Anfänger-Themen 15
L Hilfe bei RegEx Java Basics - Anfänger-Themen 4
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Neuling47 bräuchte dringend hilfe Java Basics - Anfänger-Themen 6
D Bräuchte Hilfe im Bezug zum printarray() Java Basics - Anfänger-Themen 4
M Bitte um Hilfe bei 2DArrays Java Basics - Anfänger-Themen 8
HeiTim Array hilfe Java Basics - Anfänger-Themen 14
M LCD-Ziffern-Hilfe Java Basics - Anfänger-Themen 6
özkan hilfe!! Java Basics - Anfänger-Themen 4
C Hilfe bei einem Anfängerprojekt Java Basics - Anfänger-Themen 25
D Abrechnung bitte um hilfe Java Basics - Anfänger-Themen 25
J Brauche Hilfe bei for-each Aufgabe Java Basics - Anfänger-Themen 1
D Zahlentabelle Anfänger braucht Hilfe Java Basics - Anfänger-Themen 1
HeiTim Brauche Hilfe soll ein nummeriertes Feld ausgeben lassen Java Basics - Anfänger-Themen 17
S Interaktive Abfrage, Hilfe mit Schleifen! Java Basics - Anfänger-Themen 6
N Hilfe bei der Installation Java Basics - Anfänger-Themen 2
J Brauche Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
S Hilfe bei Programmierung einer Hotelabrechnung Java Basics - Anfänger-Themen 5
enjoykimii Strukturierte Programmierung Hilfe Java Basics - Anfänger-Themen 29
H Bräuchte hilfe Java Basics - Anfänger-Themen 3
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
H Brauche Hilfe Java Basics - Anfänger-Themen 2
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
H Hilfe Java Basics - Anfänger-Themen 6
H Brauche hilfe Java Basics - Anfänger-Themen 3
M Hilfe - Array Aufgabe Java Basics - Anfänger-Themen 8
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
kevkev Hilfe bei Schiffe versenken Java Basics - Anfänger-Themen 5
FelixxF Erste Schritte Hilfe bei Fußball Manager Java Basics - Anfänger-Themen 2
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
josfe1234 Hilfe access denied ("java.io.FilePermission" " " "read") Java Basics - Anfänger-Themen 12
Vivien Hilfe bei Type Conversion Java Basics - Anfänger-Themen 3
Leo0909 Ich brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 2
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
N Laufzeitberechnung - dringende Hilfe! Java Basics - Anfänger-Themen 1
G Java Hilfe Java Basics - Anfänger-Themen 3
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
U anfänger braucht hilfe . wir konnten die aufgaben nicht beantworten Java Basics - Anfänger-Themen 5
A Schleifen, Hilfe! Java Basics - Anfänger-Themen 6
LeonDerStudent Hilfe bei Uniprojekt Java Basics - Anfänger-Themen 2
H Brauche Hilfe in Java Eclipse Programmieraufgabe Neuling Java Basics - Anfänger-Themen 3
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Kapfski Was habe ich falsch gemacht? Hilfe! Java Basics - Anfänger-Themen 17
R Java (Eclipse) "Lagerverwaltung" HILFE Java Basics - Anfänger-Themen 13
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
dieter000 Aufgabe Hilfe Java Basics - Anfänger-Themen 18
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
jonathanpizza Hilfe bei einer Übungsaufgabe Java Basics - Anfänger-Themen 6
dieter000 Hilfe bei dem Beispiel, wie gehe ich sowas am besten an? Java Basics - Anfänger-Themen 32
jonathanpizza Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
Q Hilfe auf Aufgabe(Matrixmultiplikation) Java Basics - Anfänger-Themen 1
jonathanpizza Hilfe bei der Aufgabe Java Basics - Anfänger-Themen 19
pry bitte Hilfe beim Kreditrechner objektorientiert Java Basics - Anfänger-Themen 6
R Hilfe bei removeduplicates Java Basics - Anfänger-Themen 5
D Brauche Dringend Hilfe...Prozedur/Funktionsprozedur Ergebnis augeben Java Basics - Anfänger-Themen 11
marcooooo einmal noch schnell hilfe bitte:/ Java Basics - Anfänger-Themen 2
Q Hilfe bei Hausaufgeben Java Basics - Anfänger-Themen 2
J Hilfe beim Label animieren Java Basics - Anfänger-Themen 1
S Hilfe Java Basics - Anfänger-Themen 1
JD_1998 Random Array sortieren mit Hilfe einer Methode Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben