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

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

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

@Service
public class AlarmStandardTabServiceImpl implements AlarmStandardTabService {
    @Autowired
    AlarmStandardTabMapper alarmStandardTabMapper;

    @Override
    public Result<List> findByAlarmType(String alarmType,Integer currentPage,Integer pageSize) {
        //查出来的格式[{"type1":"",...},{"type2":"",...},{"type3":"",...},{},{},{},{},{}]
        //前端要的格式[["type1",[{...},{...}]],["type2",[{...},{...}]],["type3",[{...},{...}]]]
        List<AlarmStandardTab> list=alarmStandardTabMapper.findByAlarmType(alarmType);

        //通过jdk1.8特性实现按告警类型分组存进map集合,分组后格式(key:分组字段值,value:该值相同的所有对象集合)
        //分组后的格式["type1":[{...},{...}],"type2":[{...},{...}],"type3":[{...},{...}]]
        //其实我觉得这样就行了,奈何前端小哥一意孤行,那就满足他
        Map<String,List<AlarmStandardTab>> 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<AlarmStandardTab>> map=list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getTypeName));

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

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

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

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

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

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

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

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

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

List<AlarmStandardTab> list=alarmStandardTabMapper.findByAlarmType(alarmType);
boolean flag = list.stream().anyMatch(m -> "fileUt".equals(m.getTypeName()));


//boolean anyMatch(Predicate<? super T> predicate)
//只要有一个条件满足即返回true

//boolean allMatch(Predicate<? super T> predicate)
//必须全部都满足才会返回true

//boolean noneMatch(Predicate<? super T> predicate)
//全都不满足才会返回true

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

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

7.list去重复

List<T> list = list.stream().distinct().collect(Collectors.toList());

猜你喜欢

转载自blog.csdn.net/weixin_46792649/article/details/105750478