如何使用带参方法作为排序键、通过Comparator多条件对列表排序?
方案1:自定义优先级Comparator排序(单元素仅出现一次)
适配你原本想用Comparator的需求,不需要用方法引用,直接写lambda表达式传入对象自身参数即可,同时解决原有多for循环可能导致的单元素重复添加问题:
// 优先级数值越小,排序越靠前 List<Object> sortedList = unsortedList.stream() .sorted(Comparator.comparingInt(obj -> { // 按优先级从高到低判断,返回对应优先级分值 if (obj.isAttributeA(obj)) return 1; if (obj.isAttributeB(obj.getField())) return 2; if (obj.isAttributeC(obj.getAnotherField())) return 3; // 不满足以上所有条件的元素放在最后 return Integer.MAX_VALUE; })) .toList();
同优先级内的元素会保留原列表的相对顺序,后续新增优先级条件只需要新增判断分支即可。
方案2:按优先级条件拼接(和原有多for循环逻辑完全一致)
如果你的业务逻辑要求满足多个条件的元素需要在不同优先级段重复出现,和你现在写的多for循环逻辑对齐,可以用条件列表简化代码:
// 按优先级从高到低定义条件列表,新增条件直接往列表里加即可 List<Predicate<Object>> priorityConditions = List.of( obj -> obj.isAttributeA(obj), obj -> obj.isAttributeB(obj.getField()), obj -> obj.isAttributeC(obj.getAnotherField()) ); List<Object> sortedList = priorityConditions.stream() // 逐个条件过滤原列表元素,按优先级顺序拼接 .flatMap(condition -> unsortedList.stream().filter(condition)) .toList();
内容的提问来源于stack exchange,提问作者unboundedcauchy
相关产品推荐
相关产品推荐

