Обычная сортировка по полю выглядит просто:
users.sort(Comparator.comparing(User::name));
Но если
name() у какого-то пользователя вернёт null, сортировка может упасть с NullPointerException.Например:
record User(String name) {}
var users = new ArrayList<>(List.of(
new User("Bob"),
new User(null),
new User("Ann")
));Для таких случаев в Comparator есть специальные обёртки:
Comparator.nullsLast(String::compareTo)
Теперь null можно отправить в конец:
users.sort(Comparator.comparing(
User::name,
Comparator.nullsLast(String::compareTo)
));
Результат будет предсказуемым:
Ann
Bob
null
Если null нужно поставить в начало, есть nullsFirst:
users.sort(Comparator.comparing(
User::name,
Comparator.nullsFirst(String::compareTo)
));
То же самое удобно для дат, email, optional-полей из базы и данных из внешних API:
orders.sort(Comparator.comparing(
Order::paidAt,
Comparator.nullsLast(Comparator.naturalOrder())
));
Так сортировка явно показывает бизнес-правило: пустые значения не ломают код, а уходят туда, куда нужно.
Если поле для сортировки может быть null, лучше сразу описать это через nullsFirst/nullsLast, а не надеяться, что данные всегда идеальные.
👉 Java Ready | #совет
