Abrufen eines Objekts mit der Eigenschaft max. Datum aus der Liste der Objekte Java 8
Lesezeit: 3 Minuten
Ich habe eine Klasse namens Contact das hat ein Date lastUpdated; Variable.
Ich möchte die ziehen Contact aus einem List<Contact> das hat das max lastUpdated Variable.
Ich weiß, dass dies durch Schreiben eines benutzerdefinierten Komparators und Verwenden möglich ist Collections.maxaber ich habe mich gefragt, ob es eine Möglichkeit gibt, dies in Java 8 zu tun, für die kein benutzerdefinierter Komparator erforderlich ist, da ich nur den mit einem maximalen Datum an nur einer Stelle in meinem Code ziehen möchte, und die Contact Klasse sollte nicht immer die verwenden lastUpdated Variable zum Vergleichen von Instanzen.
Tagir Walejew
Das Schreiben eines benutzerdefinierten Komparators in Java-8 ist sehr einfach. Verwenden:
Comparator.comparing(c -> c.lastUpdated);
Wenn Sie also eine haben List<Contact> contactskönnen Sie verwenden
Freundliche Erinnerung an zukünftige Leser: Stellen Sie sicher, dass Sie vorab prüfen, ob die Immobilie hydratisiert ist (nicht null). In diesem Fall ist lastUpdated für die Elemente in der Sammlung nicht null.
– GranadaCoder
18. Oktober 2019 um 14:22 Uhr
Dies löst eine NoSuchElementException aus, wenn die Sammlung leer ist
Dies funktioniert perfekt in meinem Anwendungsfall, den ich hatte. Musste die letzte durch getLastModified-Datei abrufen, die in meinem Fall ein Timestamp ist.
– OmriYaHoo
28. März 2018 um 7:00 Uhr
Das bevorzuge ich immer.
– Vishwa Ratna
11. April 2019 um 6:49 Uhr
und die Contact-Klasse sollte nicht immer die lastUpdated-Variable zum Vergleichen von Instanzen verwenden
Sie müssen also immer dann einen benutzerdefinierten Komparator bereitstellen, wenn Sie mehrere Instanzen anhand ihrer vergleichen möchten lastUpdated -Eigenschaft, da dies impliziert, dass diese Klasse standardmäßig nicht mit diesem Feld vergleichbar ist.
Wie Sie wissen, können Sie entweder verwenden Collections.max oder die Stream-API, um die maximale Instanz gemäß diesem Feld abzurufen, aber Sie kommen nicht darum herum, einen benutzerdefinierten Komparator zu schreiben.
Ist das eine oder andere (Collections.max oder stream().max(Comparator<T>).get()) leistungsfähiger?
– Andreas Mairose
27. Juli 2015 um 15:38 Uhr
@AndrewMairose Sie können messen, um zu sehen, dass ich keinen großen Unterschied zwischen beiden erwarte, aber nur die Messungen sagen Ihnen, wie genau es ist. Der Stream-Ansatz kann es Ihnen jedoch ermöglichen, die Berechnungen parallel durchzuführen, wenn Ihr Datensatz groß genug ist, um sich zu lohnen.
– Alexis C.
27. Juli 2015 um 15:42 Uhr
Verwenden List<T>.stream().max(Comparator<T>).get() nachdem Sie eine geeignete definiert haben Comparator.
Da Sie es mit Java 8-Lambdas machen wollten, verwenden Sie diese (vorausgesetzt, Sie haben List<Contact> contacts):
Dies funktioniert nicht gut mit einer großen Anzahl von Elementen. Die sorted()-Methode impliziert eine O(N log N)-Komplexität, und der Ansatz, der max(Comparator) verwendet (dh die akzeptierte Antwort), hat eine lineare Komplexität, was besser ist. Mit anderen Worten, Sie müssen nicht die gesamte Sammlung sortieren, um das einzelne Element mit der Eigenschaft max zu finden. Es ist nur ein einziger Durchgang erforderlich.
– dimnv
6. Oktober 2021 um 11:43 Uhr
Dies funktioniert nicht gut mit einer großen Anzahl von Elementen. Die sorted()-Methode impliziert eine O(N log N)-Komplexität, und der Ansatz, der max(Comparator) verwendet (dh die akzeptierte Antwort), hat eine lineare Komplexität, was besser ist. Mit anderen Worten, Sie müssen nicht die gesamte Sammlung sortieren, um das einzelne Element mit der Eigenschaft max zu finden. Es ist nur ein einziger Durchgang erforderlich.
– dimnv
6. Oktober 2021 um 11:43 Uhr
14360900cookie-checkAbrufen eines Objekts mit der Eigenschaft max. Datum aus der Liste der Objekte Java 8yes