案外詰まったので備忘用に残します。
やること
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;
}