Reputation: 2345
What is the cleanest short way to get this done ?
class AnObject{
Long attr;
}
List<AnObject> list;
I know it can be done with custom comparator for AnObject
. Isn't there something ready out of the box for such case?
Kind of like this:
Collections.sort(list, X.attr);
Upvotes: 78
Views: 140826
Reputation: 488
A null-safe option to JB Nizet's and Alex's answer above would be to do the following:
list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsFirst(Comparator.naturalOrder())));
or
list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsLast(Comparator.naturalOrder())));
Upvotes: 12
Reputation: 2976
As a complement to @JB Nizet's answer, if your attr is nullable,
list.sort(Comparator.comparing(AnObject::getAttr));
may throw a NPE.
If you also want to sort null values, you can consider
list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsFirst(Comparator.naturalOrder())));
or
list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsLast(Comparator.naturalOrder())));
which will put nulls first or last.
Upvotes: 30
Reputation: 691715
Assuming you actually have a List<AnObject>
, all you need is
list.sort(Comparator.comparing(a -> a.attr));
If you make you code clean by not using public fields, but accessor methods, it becomes even cleaner:
list.sort(Comparator.comparing(AnObject::getAttr));
Upvotes: 184