Stream und LocalDate

Wuast

Bekanntes Mitglied
Passt das zusammen? Ich habe recherchiert, wie ich eine Liste nach LocalDates sortieren kann und bin darauf gestoßen, dass das auch mit Streams gehen sollte.
Eclipse sieht das aber anders. Liegt das an mir oder meiner Umsetzung oder passt das einfach nicht?

Java:
private List <cf> sortListforDates() {
        List <cf> financesSortedForDate = date.getCfDate()
                                                .stream()    //hier will er nicht
                                                .Comparator.comparing(CashFlow :: getCfDate)
                                                .collect(Collectors.toList());
        return cf;
    }

Würd mich über ne kurze Rückmeldung freuen.
Danke 🙂
 
Natürlich geht das, sofern, sofern man es richtig macht.

Was hier fehlt ist ein Verständnis was für Datentypen du da hast. Das sieht aber so falsch aus.

Die Methode stream() geht nur auf Listen - ich vermute mal date.getCfDate() lieft ein Datum zurück. Ein Datum kann man nicht streamen. Du willst laut deinem Code ein Datum nach einem Datum sortieren

Du sagst quasi "Sortiere mir das Objektt 07.12.2022". Das geht nicht.

Du musst schon die Liste deiner (vermutlich CashFlow?) Objekte streamen und dann diese Liste sortieren.
 
Ajo du hast recht.. ich habe gar nicht die Liste gestreamt 😀

Und wie füttere ich den Comparator richtig? Der möchte LocalDate jetzt nicht mehr haben..
Java:
private List <cf> sortListforDates() {
        List <CashFlow> financesSortedForDate = getCfList()
                                                .stream()
                                                .Comparator.comparing//LocalDate//(CashFlow :: getCfDate)
                                                .collect(Collectors.toList());
        return financesSortedForDate;
    }
mies auskommentiert, aber wollte die Stelle deutlich machen.
 
Comparator.comparing(CashFlow::getCfDate) ist schon korrekt, sondern die Methode getCfDate des CashFlow Objektes ein Objekt zurückliefert was Comparable implementiert (wie z.B. ein LocalDate). Allerdings fehlt der sorted aufruf drum rum

Also
Java:
 getCfList().stream().sorted(Comparator.comparing(CashFlow::getCfDate)).collect(....);
 
Comparator.comparing(CashFlow::getCfDate) ist schon korrekt, sondern die Methode getCfDate des CashFlow Objektes ein Objekt zurückliefert was Comparable implementiert (wie z.B. ein LocalDate). Allerdings fehlt der sorted aufruf drum rum

Also
Java:
 getCfList().stream().sorted(Comparator.comparing(CashFlow::getCfDate)).collect(....);
die Methode getCfDate entstammt einer anderen Klasse. dann brauche ich doch date.getCfDate() ... aber das ist kein funktionales interface.
aber ich komme an das LD auch über die Klasse CashFlow, getIncomeDate und dann geht es auch 🙂

Ich danke dir.
 
hm das ist eine gute Frage. Woher soll der Collections.sort denn wissen, wonach der die Objekte in der Liste sortieren soll? Da gibts ja einmal das LocalDate aber auch Doubles und Strings.

mir kam gerade eher noch der Gedanke, ob ich nicht eine mapToLocalDate brauche (die es aber nicht zu geben scheint) und insofern wohl eher Blödsinn. 🙂
 
Woher soll der Collections.sort denn wissen, wonach der die Objekte in der Liste sortieren soll?
Tipp: Einfach mal auf den Link klicken.

Das ist immer das Gleiche: Entweder es gibt eine "natural Order" (Die Klasse implementiert Comparable<T>) oder es wird ein Comparator mitgegeben. Also 1:1 wie bei der Sortierung im Stream.
 
Ok für mich zum Verständnis: Wo liegt der Vorteil darin? Wenn ich jetzt überall das Interface implementieren muss, wird der Code dadurch nicht "komplizierter" als wenn ich einfach nur eine Methode mit einem Stream habe?
 
Du kannst Comparable<T> implementieren, wenn du die Klasse selbst ändern darfst/kannst. Das ist natürlich bei LocalDate eher nicht der Fall.
Für die Fälle, wo du für dich nicht änderbare Klassen um die Funktionalität der Vergleichbarkeit zwecks Sortierung erweitern möchtest, existiert eben die Möglichkeit, den Sortierungsmethoden einen Comparator explizit mitzugeben.
Desweiteren kann es in manchen Situationen durchaus Sinn machen, eben nicht nur die natürliche Ordnung zu haben, sondern pro Anwendungsfall Objekte desselben Typs nach unterschiedlichen Kriterien zu sortieren. Auch dafür ist ein bzw. sind mehrere externe Comparatoren sinnvoll.
 
Wenn ich jetzt überall das Interface implementieren muss
Musst Du doch nicht. Das ist doch ein funktionales Interface. Und das hast Du in der Stream Lösung doch auch, denn sorted nimmt doch auch einen Comparator: .sorted(Comparator.comparing(CashFlow::getCfDate))

So wie Du da den Comparator Comparator.comparing(CashFlow::getCfDate) nutzt, kannst diesen auch in Collections.sort nutzen.

Also etwas wie:
Java:
List<WhatEver> list = getCfList();
Collections.sort(list, Comparator.comparing(CashFlow::getCfDate));

(Die Typen müssen natürlich angepasst werden ... bekomst Du da eine List von LocalDate? Dann wäre es ein List<LocalDate> ....)
 
Okay, ich habs geschnallt, danke Leute 🙂

Aber nochmal kurz die Rückfrage zum Verständnis, warum du den Vorschlag überhaupt gemacht hast @KonradN : Wo liegt der Vorteil? Performance besser? Weniger Tipparbeit?
 
Man sollte seinen Code einfach halten. Keep it simple, stupid.

Und es ist Quatsch, sich Code für Dinge auszudenken, die schon längst implementiert sind.

Daher: Lern einfach, was es alles im Java Framework für tolle Klassen gibt und wie man diese einsetzen kann.
 
hihi einfach 😀
Gibt es da irgendwo eine entspannte Übersicht oder muss ich mich durch die Docs wühlen und über google fallabhängig recherchieren? 🙂 Ich kann ja gefühlt niemals die Übersicht behalten was es alles schon gibt.
aber von KISS habe ich letztens auch erstmals gelesen!

Ich werde es berücksichtigen und anpassen. Danke für deine bzw eure Rückmeldungen.
 
Das Lernen kann ja auch über das Forum erfolgen. Wenn Du so einen Link bekommst, dann kannst Du den nachlesne und damit etwas spielen.

Das Collections Framework von Java ist aber schon ein sehr zentraler Bestandteil - damit sollte man sich schon etwas mehr auseinander setzen. Aber vieles kommt mit der Zeit. Nur eben muss man offen für so Anregungen sein um dann dazu zu lernen.
 

Zurück
Oben