2015-11-02 3 views
18

Qual è il modo più semplice per ottenere questo risultato?java 8, ordina l'elenco degli oggetti per attributo senza comparatore personalizzato

class AnObject{ 
    Long attr; 
} 

List<AnObject> list; 

So che può essere fatto con comparatore personalizzato per AnObject. Non c'è qualcosa pronto fuori dagli schemi per questo caso? tipo di

Collections.sort(list, X.attr) ; 
+1

hai guardato Javadoc della classe di confronto? Hanno aggiunto un sacco di metodi (e si potrebbe fare direttamente 'list1.sort (..)' a proposito). –

risposta

51

Supponendo che in realtà hanno un List<AnObject>, tutto ciò che serve è

list.sort(Comparator.comparing(a -> a.attr)); 

Se ti fanno codice pulito, non utilizzando campi pubblici, ma metodi di accesso, diventa ancora più pulito:

list.sort(Comparator.comparing(AnObject::getAttr)); 
+0

Cosa succede se attr è nullo? – Alex

+0

Provalo e lo saprai. –

1

a complemento @JB risposta di Nizet, se il vostro attr è annullabile,

list.sort(Comparator.comparing(AnObject::getAttr)); 

può lanciare un NPE.

Se anche voi volete ordinare i valori nulli, si può considerare

list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsFirst(Comparator.naturalOrder()))); 

o

list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsLast(Comparator.naturalOrder()))); 

che metterà prima o l'ultima nulli.

0

Un'opzione null-sicuro per JB Nizet di e la risposta di Alex sopra potrebbe essere quella di effettuare le seguenti operazioni:

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsFirst(Comparator.naturalOrder()))); 

o

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsLast(Comparator.naturalOrder())));