Самое прямое и простое для чтения решение - это, вероятно, написать собственный компаратор, который реализует вашу логику сортировки.
Вы все еще можете использовать метод Comparator.comparing
, чтобы сделать его немного более симпатичным, хотя:
public static final String UNASSIGNED = "Unassigned";
List<Car> cars = List.of(
new Car("Unassigned"),
new Car("Nissan"),
new Car("Yamaha"),
new Car("Honda"));
List<Car> sortedCars = cars.stream()
.sorted(Comparator.comparing(Car::getName, (name1, name2) -> {
if (name1.equals(name2)) return 0;
if (name1.equals(UNASSIGNED)) return 1;
if (name2.equals(UNASSIGNED)) return -1;
return name1.compareTo(name2);
}))
.collect(Collectors.toList());
Также рекомендуется использовать именованную константу для специальных значений, таких как "Unassigned"
.
Также обратите внимание, что если вам не нужно хранить несортированный список cars
, вы можете отсортировать этот список вместо использования потока:
cars.sort(UNASSIGNED_COMPARATOR);