list转map(根据某1个或多个属性分组)|list对象根据某几个属性做聚合

1)List<VO>转Map<String,List<VO>>

public class Test {
    public static void main(String[] args) {
        /**
         * 根据courseId分组
         * 根据1个或多个属性分组
         */
        Map<String, List<Student>> groupMap = getList().stream().collect(
                Collectors.groupingBy(Student::getCourseId));
//        Map<String, List<Student>> groupMap = getList().stream().collect(
//                Collectors.groupingBy(s->s.getCourseId()+s.getName()));
        groupMap.forEach((courseIdKey,students)->{
            System.out.println("courseId:"+courseIdKey);
            System.out.println("sidList:"+students.stream().map(Student::getSid).collect(Collectors.toList()));
        });

        /**
         * 把某唯一属性作为key,对应的Student对象作为value
         */
        Map<String, Student> studentMap  = getList().stream().collect(Collectors
                .toMap(Student::getSid, item -> item));
//        Map<String, Student> studentMap = getList().stream().collect(Collectors
//                .toMap(s->s.getSid()+s.getName(), item -> item));
        System.out.println(studentMap);
    }
    private static List<Student> getList(){
        List<Student> list = new ArrayList<>();
        Student student = new Student();
        student.setSid("123");
        student.setName("xiaowang");
        student.setCourseId("666");
        list.add(student);
        Student student2 = new Student();
        student2.setSid("124");
        student2.setName("xiaoliu");
        student2.setCourseId("666");
        list.add(student2);
        return list;
    }
}
@Data
class Student {
    private String sid;
    private String name;
    private String courseId;
}

2)List<VO>转Map<String,List<String>> 

public static void main(String[] args) {
    List<Student> studentList = getList();
    //courseId -->sidList
    Map<String, List<String>> studentMap = studentList.stream()
            .collect(Collectors.groupingBy(
                    Student::getCourseId,
                    Collectors.mapping(Student::getSid, Collectors.toList())
            ));
    System.out.println(studentMap);
}

3)List<VO>根据某几个属性做聚合

list对象根据某几个属性将多条数据聚合为一条数据,有些字段需要做累加处理。

/**
 * 根据skuId+activityId属性 做聚合
 */
@Data
public class GoodsPriceVo {
    private String skuId;
    private String activityId;
    private Integer price;
    private Integer num;

    public static void main(String[] args) {
        List<GoodsPriceVo> priceVoList = new ArrayList<>();
        GoodsPriceVo goodsPriceVo = new GoodsPriceVo();
        goodsPriceVo.setSkuId("123");
        goodsPriceVo.setActivityId("a0001");
        goodsPriceVo.setPrice(20);
        goodsPriceVo.setNum(2);
        GoodsPriceVo goodsPriceVo2 = new GoodsPriceVo();
        goodsPriceVo2.setSkuId("123");
        goodsPriceVo2.setActivityId("a0001");
        goodsPriceVo2.setPrice(10);
        goodsPriceVo2.setNum(1);
        priceVoList.add(goodsPriceVo);
        priceVoList.add(goodsPriceVo2);
        System.out.println("聚合前:"+priceVoList);

        List<GoodsPriceVo> newGoodsPriceList = new ArrayList<>();
        priceVoList.parallelStream().collect(Collectors.groupingBy(item -> item.getActivityId() + item.getSkuId(), Collectors.toList()))
                .forEach((id, transfer) -> transfer.stream().reduce((a, b) -> {
                            GoodsPriceVo priceVo = new GoodsPriceVo();
                            priceVo.setSkuId(a.skuId);
                            priceVo.setActivityId(a.getActivityId());
                            priceVo.setPrice(a.getPrice() + b.price);
                            priceVo.setNum(a.getNum() + b.getNum());
                            return priceVo;
                        }
                ).ifPresent(newGoodsPriceList::add));
        System.out.println("聚合后:"+newGoodsPriceList);
    }
}

聚合前:[GoodsPriceVo(skuId=123, activityId=a0001, price=20, num=2), GoodsPriceVo(skuId=123, activityId=a0001, price=10, num=1)]
聚合后:[GoodsPriceVo(skuId=123, activityId=a0001, price=30, num=3)]

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值