巧用 Comparator.comparing() 做多次排序

61 阅读1分钟

现在有个列表 List ,元素 GoodsInfoDTO 里有 3 个字段 amount, isTop 和 topOrder。isTop 有的是 true, 有的是false,现在需要把字段 isTop 是 true 的元素放在 isTop 是 false 的前面,同时要保证 字段 isTop 是 true 的元素 是按照 amount 降序排序的, 最后把isTop是true的元素按照amount降序从1开始写入 topOrder,例如排在最前面的 isTop 是true的元素的topOrder是1。

    /**
     * 重新对商品排序,topN商品按照消耗量从上到下升序排序并写入topOrder,后面是普通商品
     */
    public static List<GoodsInfoDTO> reorderGoodsInfoDTO(List<GoodsInfoDTO> goodsInfoDTOs) {
        goodsInfoDTOs.sort(
            // 先按 isTop 降序排序,将 true 放在前面
            Comparator.comparing(GoodsInfoDTO::getIsTop).reversed()
            // 再按 atmosphereConsumeAmount 降序排序
    .thenComparing(Comparator.comparing(GoodsInfoDTO::getAtmosphereConsumeAmount).reversed())
        );
        
        // 对排序后的列表重新赋值 topOrder
        int topOrderIndex = 1;
        for (GoodsInfoDTO goods : goodsInfoDTOs) {
            if (goods.getIsTop()) {
                goods.setTopOrder(topOrderIndex++);
            }
        }

        return goodsInfoDTOs;
    }