最近写了几个接口,获取某某班知识点、认知层次、核心素养、关键能力以及题型的得分详细情况。它们分为不同得entity,共同继承了同一个父级entity。如下代码所示:
@Data
public class ReportClassKnowledgeVo extends BaseFourElements implements Serializable {
/*知识点*/
private Long knowledgeId;
/*认知层次*/
private Long level;
/*知识点的名称*/
private String knowledgeName;
}
这些得分详细情况处理后都放到班级下面去。它们的业务处理完全一样,就是实体不一样,所以我想把這些都相同的业务处理提出来作为一个方法,减少代码的冗余。如下代码所示:
public <T> List<SchoolClassVo> detailClassData(Long schoolCode, String classIds,List<T> t){
List<SchoolClassVo> schoolClass= userService.findClassById(StringArray.getStringArray(classIds));
schoolClass.addAll(ObjFactory.createObjClass(classIds,schoolCode,schoolClass.size()>0 ? schoolClass.get(0).getGradeCode():null));
List<Object> knowledges = new ArrayList<>();
for (SchoolClassVo schoolClassVo:schoolClass){
//classKnowledges這个集合中的值是现按照班级排序,然后再按照得分率排序的。所以同一个班级一定是连着的
int num = 0;
for (int i = 0 ;i<((ArrayList) t).size();i++){
JSONObject jsonStu = (JSONObject) JSONObject.toJSON(t.get(i));
if (schoolClassVo.getClassCode().longValue() == Long.parseLong(jsonStu.get("classId").toString())){
knowledges.add(((ArrayList) t).get(i));
num++;
}else if(num > 0 || ((ArrayList) t).size()-1 == i){
//1.如果num>0,说明已经找到当前這个schoolClassVo班级在classKnowledges集合中的各元素了
//2.它找遍了classKnowledges集合的所有元素,也没有找到
schoolClassVo.setList(knowledges);
knowledges = new ArrayList<>();
break;
}
if (((ArrayList) t).size()-1 == i){
schoolClassVo.setList(knowledges);
knowledges = new ArrayList<>();
break;
}
}
}
return schoolClass;
}
从方法的参数中我们可以看到,List t 這个参数。就是不同entity对象的数组。要处理其中每一个对象元素,需要将它转成JSONObject (package com.alibaba.fastjson)。然后xx.get(key)就可以取到想要的值,并进行判断或处理。
這里有三个需要注意的地方:
- 方法返回类型定义
- 参数
- 转换处理
以上是范型一个简单的使用。