最直接、最易于阅读的解决方案可能是编写一个自定义比较器来实现您的排序逻辑。
不过,您仍然可以使用该方法使其更漂亮一些: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(toList());
可以将“末端”功能提取到单独的可比较组合器方法中。喜欢这个:
List<Car> sortedCars = cars.stream()
.sorted(Comparator.comparing(Car::getName, withValueAtEnd(UNASSIGNED)))
.collect(toList());
public static <T extends Comparable<T>> Comparator<T> withValueAtEnd(T atEnd) {
return withValueAtEnd(atEnd, Comparator.naturalOrder());
}
public static <T> Comparator<T> withValueAtEnd(T atEnd, Comparator<T> c) {
return (a, b) -> {
if (a.equals(atEnd)) return 1;
if (b.equals(atEnd)) return -1;
return c.compare(a, b);
};
}
此外,对特殊值(如 ."Unassigned"
另请注意,如果您不需要保留未排序的列表,则可以就地对该列表进行排序,而不是使用流:cars
cars.sort(UNASSIGNED_COMPARATOR);