zoukankan      html  css  js  c++  java
  • Java8的groupBy实现集合的分组

    场景:
    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#

  • 相关阅读:
    致橡树——舒婷
    MPU6050
    Android自动折行TextView Group
    基于LRU Cache的简单缓存
    如果不能给心以翅膀,她如何飞翔
    ubuntu手机识别
    Webkit JNI
    scrapy入门
    Webkit二:RenderTree 创建
    Webkit一:Dom转码和解析
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12529602.html
Copyright © 2011-2022 走看看