【精品】list 元素 分组

时间:2022-08-03 00:53:38

应用场景

在开发过程中,经常会遇到把一个List集合中的对象按照某个属性进行分组,然后对分组后的结果进行处理的这种情况。 比如,下图按pay_method_type分组展示就是实际开发的场景: 【精品】list 元素 分组![image.png]

示例

假设存在实体类

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PayMethodVO {
    /**
    * 编号
    */
    private Long id;

    /**
    * 支付方式
    */
    private String name;

    /**
    * 图片
    */
    private String pic;

    /**
    * 支付方式类别
    */
    private Long payMethodType;
}

传统方式

public static void main(String[] args) {
        List<PayMethodVO> payMethodVOList = .....;

        Map<Long,List<PayMethodVO>> payMethodVOListMap = new HashMap<>();

        for (PayMethodVO payMethodVO : payMethodVOList) {
            List<PayMethodVO> tmp = payMethodVOListMap.get(payMethodVO.getPayMethodType());
            if(tmp == null){
                tmp = new ArrayList<>();
            }
            tmp.add(payMethodVO);
            payMethodVOListMap.put(payMethodVO.getPayMethodType(), tmp);
        }

	System.out.println(map);
}

采用流的方式:使用Collectors.groupingBy

public static void main(String[] args) {
        //支付方式
        List<PayMethodVO> payMethodVOList = .....;

        Map<Long, List<PayMethodVO>> map = payMethodVOList.stream().collect(Collectors.groupingBy(PayMethodVO::getPayMethodType));

	System.out.println(map);
}

两种方式效果完全一致。