Java reduce() + Lambda

LeeSin

Mitglied
Servus zusammen,

ich arbeite aktuell an einer Übungsaufgabe stehe aber aktuell total aufm Schlauch und poste nun aus Verzweiflung in dieses Forum.

Meine Aufgabe: eine größere Aufgabe, dies hier ist der letzte Teil: Auf jeden Fall soll ich einen JUnit Test schreiben dabei 5 Instanzen von Kunden erstellen und diese über das enum "SORT BY ID" nach der Kundennummer sortieren lassen.
Java:
    Kunde k1 = new Kunde(1, "Neuer", "Manuel", "Bayern");
    Kunde k2 = new Kunde(2, "Reus", "Marco", "Dortmund");
    Kunde k3 = new Kunde(3, "Ibrahimovic", "Zlatan", "Miland");
    Kunde k4 = new Kunde(4, "Rashford", "Marcus", "London");
    Kunde k5 = new Kunde(5, "Götze", "Mario", "Frankfurt");
    List<Person> kunden = new ArrayList<>();

    @Test
    void testSortByID() {
        kunden.add(k1);
        kunden.add(k2);
        kunden.add(k3);
        kunden.add(k4);
        kunden.add(k5);
        Kunde.setSort(Sortierkriterien.SORT_BY_ID);

//Hier dann den Test machen? 
// assertEquals(liste mit Stream und reduce sortieren, Collections.sort(kunden));

Ich füge also einer ArrayList die Kunden Objekte hinzu und lasse sie über das enum sortieren, dies greift auf den comparator zu etc.

Naja auf jeden Fall soll ich nun damit: Fügen Sie abschließend einen JUnit5-Test hinzu, in dem Sie eine Liste mit mindestens 5 Kunden-Instanzen nach der ID sortieren lassen und die korrekte Reihenfolge unter Verwendung der reduce-Methode von Stream und einem Lambda-Ausdruck über– prüfen lassen. Für die Überprüfung darf die compareTo-Methode nicht verwendet werden, da diese ja damit getestet werden soll.

Ich suche nun seit Stunden danach wie ich eine Liste nach einem int mit reduce sortieren lassen kann? Aber finde einfach keine vernünftige Lösung. Stehe ich total aufm Schlauch? Habe ich irgendwie die Anforderung nicht verstanden? -> Ich soll doch zeigen das quasi mit der reduce methode und einem lambda dass gleiche raus kommt wie bei Collections.sort(liste)? Also dieselbe Liste.

Ansätze:
ich denke mal ich muss auf die ArrayList die stream methode aufrufen und dann die reduce methode dort dann mit einem lambda die methode von reduce überschreiben (aber einfach keine Ahnung wie...) und das gibt mir dann irgendwie die Liste sortiert zurück?

Aus den Java docs werde ich irgendwie auch nicht schlauer...

Hoffentlich versteht jemand mein Wirrwarr und kann mir auf die Sprünge helfen! Ich wäre enorm dankbar!

Viele Grüße
LeeSin
 
Die Sortierung soll - soweit ich das verstehe - nicht über reduce gemacht werden (wäre auch seltsam).

Nur die Überprüfung ob die Liste richtig sortiert ist. Wie zum Geier die Überprüfung sinnvoll mit einer reduce Methode aussehen soll, ist mir aber ach fraglich.

Grundsätzlich arbeitet reduce ja in der Form "Aus 2 mach 1". Sprich, wenn die Liste aufsteigend sortiert ist, könnte man reduce dazu nutzen, dass es zwei Dinge macht:

* Überprüft, dass das erste Element kleiner als zweite Element ist (ohne compareTo zu benutzen....)
* Das zweite Element zurückgeben

Aber irgendwie sieht das ziemlich schräg für mich aus.
 
die korrekte Reihenfolge unter Verwendung der reduce-Methode von Stream und einem Lambda-Ausdruck über– prüfen lassen.
Beim Reduzieren ist am Anfang kein Objekt da, also null.

Danach muss das aktuelle Objekt grösser gleich dem Vorgänger-Objekt sein.

Wenn das aktuelle Objekt nicht grösser gleich dem Vorgänger-Objekt ist, wird mit Assert.fail() der Test als fehlerhaft beendet.

Das aktuelle Objekt überschreibt das vermerkte Vorgänger-Objekt.

(Dass man da nicht selbst drauf kommt, wundert mich)
 
Wobei das halt trotzdem absurd ist. (Nichts gegen dich, das wäre vermutlich eine legitime Lösung).

Die normale Lösung wäre komplett ohne Streams und einfach ein explizites assert auf die einzelnen ellemente in der Liste also so eine bescheuerte Verrenkung mittels reduce.

Und weil ich es so bescheuert ist, hier mal eine Lösung die ähnlich bescheuert wie die Idee ist 🙂

Java:
package de.limdul.javaforum;

import static org.junit.Assert.fail;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import org.junit.jupiter.api.Test;

public class ReduceAssert {

    @Test
    public void testSortierung() {
        List<Integer> intList = Arrays.asList(5, 4, 8, 2, 3, 8);

        Collections.sort(intList);

        Optional<Integer> reduce = intList.stream().reduce(this::isOk);
        assertEquals(reduce.orElse(null), Integer.valueOf(8));
    }

    private Integer isOk(Integer left, Integer right) {
        if (left == 2 && right != 3) {
            fail("Fail");
        } else if (left == 3 && right != 4) {
            fail("Fail");
        } else if (left == 4 && right != 5) {
            fail("Fail");
        } else if (left == 5 && right != 8) {
            fail("Fail");
        } else if (left == 8) {
            fail("Fail");
        }
        return right;
    }

}
 
Wenn ihr schon so lustig am Lösen seid, habe ich auch einen Vorschlag:
Java:
List<String> list = List.of("A","B","C","D");
Iterator<String> it = list.iterator();
assertTrue(list.stream().sorted().sequential().map(s -> s.equals(it.next())).reduce(true, (a,b) -> a && b));
 

Zurück
Oben