集合(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 }