2015-07-27 3 views
16

Ho una classe denominata Contact che ha una variabile Date lastUpdated;.Ottenere oggetto con proprietà data massima dall'elenco di oggetti Java 8

Vorrei estrarre lo Contact da un List<Contact> che ha la variabile massima lastUpdated.

So che questo può essere fatto scrivendo un comparatore personalizzato e usando Collections.max, ma mi chiedevo se c'è un modo in cui ciò può essere fatto in Java 8 che non richiede l'uso di un comparatore personalizzato, poiché voglio solo tira quello con una data massima in un solo punto del mio codice, e la classe Contact non dovrebbe sempre usare la variabile lastUpdated per confrontare le istanze.

risposta

14

e la classe di contatto non deve usare sempre la variabile lastUpdated per il confronto di istanze

Quindi si dovrà fornire un comparatore personalizzato ogni volta che si desidera confrontare più istanze da loro proprietà lastUpdated, in quanto implica che questa classe non è comparabile per impostazione predefinita con questo campo.

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

come sapete è possibile utilizzare Collections.max o il flusso di API per ottenere l'istanza massimo in base a questo campo, ma non si può evitare di scrivere un comparatore personalizzato.

+0

è uno o l'altro ('Collections.max' o max () .get' flusso() Comparatori() '.) Più performante? –

+1

@AndrewMairose È possibile misurare per vedere che non mi aspetto molta differenza tra entrambi, ma solo le misurazioni ti diranno quanto è esattamente. L'approccio al flusso può tuttavia consentire di eseguire i calcoli in parallelo se il set di dati è sufficientemente grande per valerne la pena. –

28

La scrittura di un comparatore personalizzato in Java-8 è molto semplice. Usa:

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

Quindi, se si dispone di un List<Contact> contacts, è possibile utilizzare

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

Usa List<T>.stream().max(Comparator<T>).get() dopo aver definito un adeguato Comparator.

8

provare il seguente (non testato):

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