为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据嵌套对象的多次比较进行流排序?

如何根据嵌套对象的多次比较进行流排序?

海绵宝宝撒 2023-10-13 14:50:37
型号示例:我需要根据驾驶员的性别和年龄对汽车流进行排序。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());


查看完整回答
反对 回复 2023-10-13
?
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:

让编译器知道您正在比较Cars:

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));


查看完整回答
反对 回复 2023-10-13
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信