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.
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é.
É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));
Essayez ce qui suit (non testé):
contacts.stream().max(Comparator.comparing(Contact::getLastUpdated)).get()
Utilisez List<T>.stream().max(Comparator<T>).get()
après avoir défini un Comparator
approprié.