根据某个对象属性,获取对象集合中所有不重复的值(去重)

比如现在有个studentView(继承自student),里面有id,name,age,home,province,school,grade等字段,现在有一个List<student>的集合,现在想知道这些student都分布在哪些province,哪些school,和他们的home都有哪些;

以后可能还有实体类team,有id,teamName,level,school等;

正常情况我们会用sql的形式,用distinct的方式,逐个返回,但现在因为数据都已经返回到了后端,不想再通过查询数据库的方式获取,那么在后台该怎么实现呢?

1、因为要处理不同实体类的集合,所有要用到泛型

2、到时候要根据不同的属性字段,进行去重,所有要用到java的反射类

3、其余的要用到一个临时map集合,用于判断去重

下面是实现代码:

 
  
import java.lang.reflect.Field;
import org.apache.commons.lang.StringUtils;
//上面是两个特殊的包,一个是反射类的,一个是判断非空的,因为用到了,所有提一下
public static<T> List<T> distinctByAttr(List<T> mcList, String attr) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        Map<String, String> tempMap = new HashMap<>();
        List<T> returnList = new ArrayList<>();
        for(T item : mcList){
            Field field = null;
            Class<?> clazz = item.getClass();
            for (; clazz != Object.class; clazz = clazz.getSuperclass()) {  
                try {  
                    field = clazz.getDeclaredField(attr);  //这种是因为有些属性是View(即父类)里面的,要牺牲这样大概10行代码来处理
                } catch (Exception e) {
                    // 这里甚么都不能抛出去。  
                    // 如果这里的异常打印或者往外抛,则就不会进入  
                }  
            }
            //Field field = item.getClass().getDeclaredField(attr);//如果属性值都是实体类里面存在的话,这种一行代码就搞定,很方便
            field.setAccessible(true);//这句很关键,不能少
            //String echoValue = item.getProvince();
            String echoValue = field.get(item) == null ? "" : field.get(item).toString();//这里是考虑到属性值有为空的时候,避免抛出异常
       //下面就是如何去重了
if(echoValue.equals("")){ continue; }else{ String mapValue = tempMap.get(echoValue);//如果mapValue是空的 说明取到的这个是第一次取到 if(StringUtils.isBlank(mapValue)){ tempMap.put(echoValue, echoValue); returnList.add(item);//这里最好返回List<String>,里面放去重后的值,返回List<Object>的话,取值时要知道是根据那个属性去重后的 }else{ continue; } } } tempMap.clear(); return returnList; }

下面大概讲下如何调用这个静态公有方法

//直接类名.静态方法名就好了,这里List就是封装好的list数据,attr就是对应实体类里面的字段名(这个一定不能拼写错)
MgCommonService.distinctByAttr(List, "attr");

这也是第一次实际运用泛型,并且结合反射类,END!!

转载于:https://www.cnblogs.com/zz-3m23d-begining/p/8391576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值