型號示例:我需要根據(jù)駕駛員的性別和年齡對汽車流進(jìn)行排序。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());}我不想創(chuàng)建特殊的比較器類或?qū)崿F(xiàn)比較器接口。我的用例可能嗎?過去一個小時我一直在瀏覽 SO,但沒有一個答案有效。
2 回答

森欄
TA貢獻(xiàn)1810條經(jīng)驗 獲得超5個贊
可能類型推斷不夠強(qiáng)大。這對我有用:
return cars.stream() .sorted(Comparator.comparing(car -> ((Car) car).getDriver().getGender()) .thenComparingInt(car -> ((Car) car).getDriver().getAge())) .collect(Collectors.toList());

largeQ
TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
如果你想避免強(qiáng)制轉(zhuǎn)換,你還有兩個選擇:
選項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());
編輯:實際上,您還有更多選擇。根據(jù) @Andreas 的評論,您可以傳遞類型Comparator.<Car, String>comparing
,也可以編寫自己的comparing
函數(shù),如下所示:
sorted((car1, car2) -> {/*function body that returns -1, 0, 1 */}
另外,如果你想List<Car>
排序,可以直接使用sort()
方法:
cars.sort(com1.thenComparing(com2));
添加回答
舉報
0/150
提交
取消