0
点赞
收藏
分享

微信扫一扫

Java8的groupBy实现集合的分组

一ke大白菜 2022-03-30 阅读 58


场景:

Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map


1.对集合按照单个属性分组

e.g. 按照skuId分组


Map<String, List<EntryDeliveryDetailywk>> detailsMap01 = dtos1.stream()

.collect(Collectors.groupingBy(EntryDeliveryDetailywk::getskuId));

1

2

2对集合按照多个属性分组

solution 1 多个属性拼接出一个组合属性

将多个字段拼接成一个新字段,在使用Java8的groupBy进行分组


Map<String, List<EntryDeliveryDetailywk>> detailmap = details.stream()

.collect(Collectors.groupingBy(d -> fetchGroupKey(d) ));


private String fetchGroupKey(EntryDeliveryDetailywk detail){

        return detail.getSkuId().toString()

        + detail.getItemsName()

        + detail.getWarehouseId().toString()   

        + detail.getSupplierId().toString();

    }


solution 2 造静态内部类

在集合元素类里构造静态内部类(成员变量即分组的对应多个属性)

e.g.


//静态内部类

class Person {

    public static class NameAge {

        public NameAge(String name, int age) {

            ...

        }


        // 注意 重写方法 must implement equals and hash function

    }


    public NameAge getNameAge() {

        return new NameAge(name, age);

    }

}


//分组

Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));


solution 3 嵌套调用Java8 groupby

注意得到也是嵌套map


Map<String, Map<Integer, List<Person>>> map = people

    .collect(Collectors.groupingBy(Person::getName,

        Collectors.groupingBy(Person::getAge));


//调用

map.get("Fred").get(18);


参考

https://stackoverflow.com/questions/28342814/group-by-multiple-field-names-in-java-8#



梅花香自古寒来


举报

相关推荐

0 条评论