型号示例:我需要根据驾驶员的性别和年龄对汽车流进行排序。public class Car { String color; Driver driver; }public class Driver { String name; Integer age; String gender; }public List<Car> sortCars(List<Car> cars) { return cars.stream() .sorted(Comparator .comparing(car -> -1 /* car.getDriver().getGender() */ ) .thenComparing(car -> -1 /* car.getDriver().getAge() */ )) .collect(Collectors.toList());}我不想创建特殊的比较器类或实现比较器接口。我的用例可能吗?过去一个小时我一直在浏览 SO,但没有一个答案有效。
2 回答
森栏
TA贡献1810条经验 获得超5个赞
可能类型推断不够强大。这对我有用:
return cars.stream() .sorted(Comparator.comparing(car -> ((Car) car).getDriver().getGender()) .thenComparingInt(car -> ((Car) car).getDriver().getAge())) .collect(Collectors.toList());
largeQ
TA贡献2039条经验 获得超7个赞
如果你想避免强制转换,你还有两个选择:
选项1:
Comparator<Car> com1 = Comparator.comparing(car -> car.getDriver().getGender()); Comparator<Car> com2 = Comparator.comparing(car -> car.getDriver().getAge());
然后:
cars.stream().sorted(com1.thenComparing(com2)).collect(Collectors.toList());
选项2:
让编译器知道您正在比较Car
s:
cars.stream().sorted(Comparator.comparing((Car car) -> car.getDriver().getGender()) .thenComparing(car -> car.getDriver().getAge())) .collect(Collectors.toList());
编辑:实际上,您还有更多选择。根据 @Andreas 的评论,您可以传递类型Comparator.<Car, String>comparing
,也可以编写自己的comparing
函数,如下所示:
sorted((car1, car2) -> {/*function body that returns -1, 0, 1 */}
另外,如果你想List<Car>
排序,可以直接使用sort()
方法:
cars.sort(com1.thenComparing(com2));
添加回答
举报
0/150
提交
取消