如何根据对象的布尔属性处理Java Stream 实现可运行车辆优先排序
实现方案
你可以通过以下两种方式实现需求:
方案1:自定义比较器排序
如果后续还要叠加其他排序规则(如按车牌号、车龄排序),可以用sorted()方法自定义排序逻辑:
import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; // 排序后正常运行的车辆排在前列 List<Car> sortedCars = cars.stream() // 按isWorking倒序,true会排在false前面 .sorted(Comparator.comparing(Car::isWorking, Comparator.reverseOrder())) .collect(Collectors.toList()); System.out.println("Working Cars First" + sortedCars);
方案2:拼接两个过滤结果(性能更高,保留原顺序)
如果只需要区分正常/故障两类,同分组内保留原列表的顺序,且不需要额外排序规则,推荐用该方案,时间复杂度为O(n),比排序的O(nlogn)性能更高:
import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; List<Car> sortedCars = Stream.concat( // 先拼接所有正常运行的车辆 cars.stream().filter(Car::isWorking), // 后拼接所有无法正常运行的车辆 cars.stream().filter(car -> !car.isWorking()) ).collect(Collectors.toList()); System.out.println("Working Cars First" + sortedCars);
注意
你原有代码的问题是filter操作后的结果没有赋值给变量,直接打印的car并不是筛选后的结果,需要把流操作的返回值赋值给新的列表变量再使用。
内容的提问来源于stack exchange,提问作者Traps HD
相关产品推荐
相关产品推荐

