web-dev-qa-db-ja.com

java 8、カスタムコンパレータなしで属性別にオブジェクトのリストをソート

これを行う最もクリーンな短い方法は何ですか?

 class AnObject{
     Long  attr;
 }

 List<AnObject> list; 

AnObjectのカスタムコンパレータを使用して実行できることを知っています。そのような場合にすぐに使えるものはありませんか?やや

 Collections.sort(list, X.attr ) ;
41
Nabil Sham

実際にList<AnObject>を持っていると仮定すると、必要なのは

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

パブリックフィールドを使用せずにアクセサメソッドを使用してコードをクリーンにすると、さらにクリーンになります。

list.sort(Comparator.comparing(AnObject::getAttr));
106
JB Nizet

@JB Nizetの答えを補完するものとして、attrがNULL可能であれば、

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

nPEをスローする場合があります。

Null値も並べ替える場合は、検討できます。

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

または

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

nullを最初または最後に配置します。

11
Alex

上記のJB NizetとAlexの答えに対するヌルセーフオプションは、次のようにすることです。

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

または

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