根据某个属性对List中的所有对象分组,该属性值相同的对象分到一个组

Vesta ·
更新时间:2024-09-20
· 859 次阅读

注:本人刚入行,想把工作遇到的问题写下来。前段时间跟公司前端对接的时候,一个简单的数据库查询,但是前端说将结果按某个属性分组,每组单独一个集合,集合第一个元素为该属性,第二个元素为该属性值相同的所有对象集合,由于是小白一个,这个数据整理也是花了点时间,这里整理一下处理方法。

1.利用JDK1.8的新特性处理,主要代码一行即可解决,下面上代码

@Service public class AlarmStandardTabServiceImpl implements AlarmStandardTabService { @Autowired AlarmStandardTabMapper alarmStandardTabMapper; @Override public Result findByAlarmType(String alarmType,Integer currentPage,Integer pageSize) { //查出来的格式[{"type1":"",...},{"type2":"",...},{"type3":"",...},{},{},{},{},{}] //前端要的格式[["type1",[{...},{...}]],["type2",[{...},{...}]],["type3",[{...},{...}]]] List list=alarmStandardTabMapper.findByAlarmType(alarmType); //通过jdk1.8特性实现按告警类型分组存进map集合,分组后格式(key:分组字段值,value:该值相同的所有对象集合) //分组后的格式["type1":[{...},{...}],"type2":[{...},{...}],"type3":[{...},{...}]] //其实我觉得这样就行了,奈何前端小哥一意孤行,那就满足他 Map<String,List> map=list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getTypeName)); //下面是将已整理好格式的Map集合按照前端的意思重新整理一次。。。。可以忽略 List list2=new ArrayList(); for(String key:map.keySet()){ List list3=new ArrayList(); list3.add(0,key); list3.add(1,map.get(key)); list2.add(list3); } return Result.of(Code.SC_OK.getState(),Code.SC_OK.getDescription(),list2); } }

 上面的主要代码就是:

Map<String,List> map=list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getTypeName));

 其中AlarmStandardTab是一个实体类,getTypeName是typeName属性的get方法,也是根据这个属性类分组的

分组后的类型Map<String,List>,其实到这已经行了,key为分组名,value为对应的对象集合,后续按要求可再做整理。

2.上面是根据jdk特性来处理的,下面把我手写的代码也放上来,可以当做一个思路,返回的数据格式一模一样。

List list=alarmStandardTabMapper.findByAlarmType(alarmType); Map<String,List> map=new HashMap(); for(AlarmStandardTab alarmStandardTab:list){ //map中已有当前告警类型名 if(map.containsKey(alarmStandardTab.getTypeName())){ List list0=map.get(alarmStandardTab.getTypeName()); list0.add(alarmStandardTab); map.put(alarmStandardTab.getTypeName(),list0); }else{ List list1=new ArrayList(); list1.add(alarmStandardTab); map.put(alarmStandardTab.getTypeName(),list1); }

整理一下思路:遍历已有的list,判断map里是否有当前对象的typeName,这里使用map.containsKey(Object key)来判断;如果有,则使用map.get(Object key)来得到对应集合;否则new一个List集合,add当前对象,并且map.put(key为当前对象的typeName,value为新new的list集合)。最后的map就是分组整理好的格式Map<String,List>;

3.根据属性alarmType,汇总这个属性对应的所有对象的paramVal

Map collect = list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getAlarmType,Collectors.summingDouble(AlarmStandardTab::getParamVal)));

4.根据给alarmType属性添加条件过滤数据,如查找alarmType为fileUt的数据

List list = list.stream().filter(u -> u.getTypeName().equals("fileUt")).collect(Collectors.toList());

5.判断list里是否有元素的alarmType为fileUt,只要有一个就返回true

List list=alarmStandardTabMapper.findByAlarmType(alarmType); boolean flag = list.stream().anyMatch(m -> "fileUt".equals(m.getTypeName())); //boolean anyMatch(Predicate predicate) //只要有一个条件满足即返回true //boolean allMatch(Predicate predicate) //必须全部都满足才会返回true //boolean noneMatch(Predicate predicate) //全都不满足才会返回true

6.取出一组对象的某个属性组成一个新集合

List typeNames=list.stream().map(AlarmStandardTab::getTypeName).collect(Collectors.toList());

7.list去重复

List list = list.stream().distinct().collect(Collectors.toList());
作者:xr不经意



属性值 属性 对象 分组 list

需要 登录 后方可回复, 如果你还没有账号请 注册新账号