案外詰まったので備忘用に残します。
やること
IDを3種類持つオブジェクトについて、以下のようにソートします。
- 「
id1->id2->id3」の順でそれぞれソートする - ソートは全て昇順(
NaturalOrder)で行う- ただし、全てのソートで
nullは最後とする
- ただし、全てのソートで
ソース
// import類
import static java.util.Comparator.comparing;
import static java.util.Comparator.naturalOrder;
import static java.util.Comparator.nullsLast;
/* 略 */
static void sortIdObject(List<IdObject> idObjects) {
idObjects.sort(
comparing(IdObject::getId1, nullsLast(naturalOrder()))
.thenComparing(IdObject::getId2, nullsLast(naturalOrder()))
.thenComparing(IdObject::getId3, nullsLast(naturalOrder()))
);
}
解説
「
id1->id2->id3」の順でそれぞれソートする
この部分は、比較をcomparing(xxx).thenComparing(xxx).thenComparing...と繋いでいくことで実現できます。
ただし、全てのソートで
nullは最後とする
今回はnullが最後なのでnullsLast([Comparator])で囲いました。
そもそも、用意されているcomparatorはnullを入れるとヌルポになるため、nullableな内容を比較する場合はnullsLastかnullsFirstで囲ってやる必要があります。
また、nullsLast/Firstで囲ったとしても、compareIntなどのプリミティブ型に関する比較系はヌルポになるため注意が必要です。
ソートは全て昇順(
NaturalOrder)で行う
ComparatorにnaturalOrder()を指定することで実現できます。
逆順だとreverseOrder()を指定することで実現できます。
補足
今回並び替えるオブジェクト
// ゲッターはLombokによる生成を想定
@Getter
public class IdObject {
private Integer id1;
private Integer id2;
private Integer id3;
}