集合(Map,List)分組:多屬性進行分組

集合(Map,List)分組:多屬性進行分組

 

一、List 實體字段分組

1. 根據單一字段進行分組:

Map<Integer, List<SomeEntity>> detailTypeMap = SomeEntityS.stream().collect(Collectors.groupingBy(SomeEntity::getSomeProperty));

 

2. 根據日期字段的 yyyy-MM 進行分組:

Map<String, List<SomeEntity>> monthMap = someEntityList.stream().collect(Collectors.groupingBy(p -> cn.hutool.core.date.DateUtil.format(p.getOrderTime(), "yyyy-MM")));

 

3.1 根據 Entigy多個字段,拼成一個 進行分組:

Map<String, Map<Integer, List<SomeEntity>>> someEntityGroup = someEntityList.stream().collect(Collectors.groupingBy(SomeEntity::getSomePropertyOne, Collectors.groupingBy(SomeEntity::getSomePropertyTwo)));

 

3.2 根據 Entigy多個字段,分開進行分組:

Map<Integer, Map<Integer, Map<Integer, List<SomeEntity>>>> someEntityGroup = someEntityList.stream().collect(
Collectors.groupingBy(SomeEntity::getSomePropertyOne,
Collectors.groupingBy(SomeEntity::getSomePropertyTwo,
Collectors.groupingBy(SomeEntity::getSomePropertyThree))));

 

3.3 根據 多字段分組,引入一個包括分組字段的對象,進行分組:

 1     @Data
 2     @Builder
 3     @EqualsAndHashCode
 4     @AllArgsConstructor
 5     @NoArgsConstructor
 6     public class UseGroupEntity {
 7 
 8         /** 某屬性 */
 9         private Integer somePropertyOne;
10 
11         /** 某屬性 */
12         private Integer somePropertyTwo;
13         
14         /** 某屬性 */
15         private String somePropertyThree;
16 
17     }
18     
19     if(CollectionUtils.isNotEmpty(someEntityList)) {
20         someEntityGroup = someEntityList.stream().collect(Collectors.groupingBy(entity -> {
21             return UseGroupEntity.builder().shopId(entity.getSomePropertyOne()).contractInfoId(entity.getSomePropertyTwo()).settleWay(entity.getSomePropertyThree()).build();
22         }));
23     }

 

二、Map 多個key進行分組
4. 根據 Map中的多個字段組合進行分組:
【寫法1】:

 1         Map<String, List<Map<String, String>>> mapListGroup = new HashMap();
 2         mapListGroup = someMapList.stream().collect(Collectors.groupingBy(dataMap -> {
 3             String groupByField = "";
 4             StringBuilder groupKey = new StringBuilder();
 5             if(groupByBussTypeField.contains(",")){        // groupByBussTypeField 以逗號分隔的多分組字段的配置值 例 t1.name,t1.age,t2.score 
 6                 String[] fields = groupByBussTypeField.split(",");
 7                 for(String field : fields){
 8                     String groupField = field.substring(field.indexOf(".") + 1);    // 將 t1.name,t1.age,t2.score 的點號前的前綴切去,獲得單獨的屬性 name 和 age 和 score
 9                     groupKey.append("\"").append(groupField).append("\"").append(":").append("\"").append(String.valueOf(dataMap.get(groupField))).append("\"");
10                 }
11                 groupByField = groupKey.toString();
12             }else{
13                 groupByField = String.valueOf(dataMap.get(groupByBussTypeField.substring(groupByBussTypeField.indexOf(".") + 1)));
14             }
15             return groupByField;
16         }));


【寫法2】:

 1         Map<String, List<Map<String, String>>> voucherGroup = someMapList.stream().collect(Collectors.groupingBy((e -> fetchGroupKey(someEntityProperties, e))));
 2         
 3         private String fetchGroupKey(List<SomeEntityProperty> someEntityProperties, Map<String, String> dataMap){
 4             // log.debug("fetchGroupKey 入參:someEntityProperties:{},dataMap:{}", JSON.toJSONString(someEntityProperties), JSON.toJSONString(dataMap));
 5             if(CollectionUtils.isEmpty(collection)){
 6                 String errorMsg = "數據爲爲空,請覈查!";
 7                 log.error(errorMsg);
 8                 throw new RuntimeException(errorMsg);
 9             }
10             StringBuilder groupKey = new StringBuilder();
11             someEntityProperties.forEach(someEntityProperty -> {
12                 String fieldNameByField = someEntityProperty.getName();
13                 groupKey.append("\"").append(fieldNameByField).append("\"").append(":").append("\"").append(String.valueOf(dataMap.get(fieldNameByField))).append("\"");
14             });
15             // log.debug("依多屬性字段分組,分組依據爲:{}", groupKey.toString());
16             return groupKey.toString();
17         }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章