java 8,按属性排序对象列表,不带自定义比较器

时间:2015-11-02 21:15:44

标签: list sorting lambda java-8

完成这项工作的最简洁方法是什么?

 class AnObject{
     Long  attr;
 }

 List<AnObject> list; 

我知道可以使用AnObject的自定义比较器来完成。对于这种情况,是不是有一些现成的东西?

 Collections.sort(list, X.attr ) ;

3 个答案:

答案 0 :(得分:95)

假设您实际拥有List<AnObject>,那么您需要的只是

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

如果您通过不使用公共字段而不是使用访问器方法来使代码清理,则它变得更加清晰:

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

答案 1 :(得分:9)

作为@JB Nizet答案的补充,如果您的attr可以为空,

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

可能会抛出NPE。

如果您还想对空值进行排序,可以考虑

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

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

将把空值放在第一位或最后一位。

答案 2 :(得分:2)

JB Nizet的上述无效选项以及Alex的上述答案将是:

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

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