web-dev-qa-db-fra.com

Obtention d'un objet avec la propriété max date à partir de la liste d'objets Java 8

J'ai une classe appelée Contact qui a un Date lastUpdated; variable.

Je voudrais tirer le Contact d'un List<Contact> qui a la variable maximale lastUpdated.

Je sais que cela peut être fait en écrivant un comparateur personnalisé et en utilisant Collections.max _, mais je me demandais s’il était possible de faire cela avec Java 8) sans passer par un comparateur personnalisé, car je veux simplement extraire celui avec une date maximale une seule place dans mon code, et la classe Contact ne doit pas toujours utiliser la variable lastUpdated pour comparer des instances.

32
Andrew Mairose

et la classe Contact ne doit pas toujours utiliser la variable lastUpdated pour comparer des instances

Vous devrez donc fournir un comparateur personnalisé chaque fois que vous souhaitez comparer plusieurs instances à l'aide de leur propriété lastUpdated, car cela implique que cette classe n'est pas comparable par défaut à ce champ.

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

Comme vous le savez, vous pouvez soit utiliser Collections.max ou l’API Stream pour obtenir l’instance max en fonction de ce champ, mais vous ne pouvez pas éviter d’écrire un comparateur personnalisé.

21
Alexis C.

Écrire un comparateur personnalisé en Java-8 est très simple. Utilisation:

Comparator.comparing(c -> c.lastUpdated);

Donc, si vous avez un List<Contact> contacts, vous pouvez utiliser

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

Ou, en utilisant des références de méthodes:

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

Essayez ce qui suit (non testé):

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

Utilisez List<T>.stream().max(Comparator<T>).get() après avoir défini un Comparator approprié.

2
M. Shaw