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.

Benutzeravatar von Tagir Valeev
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

Contact lastContact = Collections.max(contacts, Comparator.comparing(c -> c.lastUpdated));

Oder mit Methodenreferenzen:

Contact lastContact = Collections.max(contacts, Comparator.comparing(Contact::getLastUpdated));

  • 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

    – eriksmith200

    5. November 2020 um 10:35 Uhr

Probier mal folgendes (ungetestet):

contacts.stream().max(Comparator.comparing(Contact::getLastUpdated)).get()

  • 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.

Comparator<Contact> cmp = Comparator.comparing(Contact::getLastUpdated);

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):

Contact latest = contacts.stream()
     .sorted(Comparator.<Contact, Date>comparing(contact-> contact.getLastUpdated(), Comparator.reverseOrder()))
     .findFirst().get();

Sie können diesen Komparator ganz einfach anpassen, indem Sie einfach weitere Komparatoren anhängen. Der Code ist also leicht änderbar.

List<Contact> sortedContacts = contacts.stream()
         .sorted(Comparator.<Contact, Date>comparing(contact-> contact.getLastUpdated(), Comparator.reverseOrder())
               .thenComparing(contact -> contact.getAge()))
         .collect(Collectors.toList());

  • 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


1436090cookie-checkAbrufen eines Objekts mit der Eigenschaft max. Datum aus der Liste der Objekte Java 8

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy