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

型号示例:


我需要根据驾驶员的性别和年龄对汽车流进行排序。


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,但没有一个答案有效。


海绵宝宝撒
浏览 82回答 2
2回答

森栏

可能类型推断不够强大。这对我有用:return&nbsp;cars.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.sorted(Comparator.comparing(car&nbsp;->&nbsp;((Car)&nbsp;car).getDriver().getGender()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.thenComparingInt(car&nbsp;->&nbsp;((Car)&nbsp;car).getDriver().getAge())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

largeQ

如果你想避免强制转换,你还有两个选择:选项1:&nbsp;Comparator<Car>&nbsp;com1&nbsp;=&nbsp;Comparator.comparing(car&nbsp;->&nbsp;car.getDriver().getGender()); &nbsp;Comparator<Car>&nbsp;com2&nbsp;=&nbsp;Comparator.comparing(car&nbsp;->&nbsp;car.getDriver().getAge());然后:cars.stream().sorted(com1.thenComparing(com2)).collect(Collectors.toList());选项2:让编译器知道您正在比较Cars:cars.stream().sorted(Comparator.comparing((Car&nbsp;car)&nbsp;->&nbsp;car.getDriver().getGender()) &nbsp;&nbsp;&nbsp;&nbsp;.thenComparing(car&nbsp;->&nbsp;car.getDriver().getAge())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());编辑:实际上,您还有更多选择。根据 @Andreas 的评论,您可以传递类型Comparator.<Car, String>comparing,也可以编写自己的comparing函数,如下所示:sorted((car1,&nbsp;car2)&nbsp;->&nbsp;{/*function&nbsp;body&nbsp;that&nbsp;returns&nbsp;-1,&nbsp;0,&nbsp;1&nbsp;*/}另外,如果你想List<Car>排序,可以直接使用sort()方法:cars.sort(com1.thenComparing(com2));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java