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

Nab*_*ham 46 sorting lambda list java-8

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

 class AnObject{
     Long  attr;
 }

 List<AnObject> list; 
Run Code Online (Sandbox Code Playgroud)

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

 Collections.sort(list, X.attr ) ;
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 119

假设你真的有一个List<AnObject>,你需要的只是

list.sort(Comparator.comparing(a -> a.attr));
Run Code Online (Sandbox Code Playgroud)

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

list.sort(Comparator.comparing(AnObject::getAttr));
Run Code Online (Sandbox Code Playgroud)

  • 测试一下,你就会知道. (12认同)
  • 如果 attr 为空会发生什么? (2认同)

Ale*_*lex 13

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

list.sort(Comparator.comparing(AnObject::getAttr));
Run Code Online (Sandbox Code Playgroud)

可能会抛出NPE.

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

    list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsFirst(Comparator.naturalOrder())));
Run Code Online (Sandbox Code Playgroud)

要么

    list.sort(Comparator.comparing(a -> a.attr, Comparator.nullsLast(Comparator.naturalOrder())));
Run Code Online (Sandbox Code Playgroud)

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


小智 10

上面 JB Nizet 和 Alex 的回答的空安全选项是执行以下操作:

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsFirst(Comparator.naturalOrder())));
Run Code Online (Sandbox Code Playgroud)

或者

list.sort(Comparator.comparing(AnObject::getAttr, Comparator.nullsLast(Comparator.naturalOrder())));
Run Code Online (Sandbox Code Playgroud)