目录
一、需求
数百万数据(类Student),根据一定的标准计算成绩,其中标准动态变化,标准数量不固定,标准规则不固定,需要根据现有的标准计算,遂想到在每条标准添加对应Student类属性值,遍历现在的标准“动态”去取Student类的值。
二、方法
1.Java反射
传入参数名,获取对应Object,然后根据对应标准把Object转成对应类型(使用策略模式具体算成绩)。
public class Student implements Serializable {
private int grade;
private List<String> courses;
public Object getByAttributeName(String attributeName) {
try {
// public属性用getField即可
Field field = this.getClass().getDeclaredField(attributeName);
field.setAccessible(true);
return field.get(this);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Object object = student.getByAttributeName(cources);
2.转Json/Map get属性值
String attributeName = xxx;
Map map = JSON.parseObject(JSON.toJSONString(student), Map.class);
map.get(attributeName);
三、取舍
刚开始感觉反射B格高一点,用的反射,十几个标准,十几次反射取数据,执行100条都得10秒,后来看了下getDeclaredField的底层实现,好像是循环去匹配名字,瞬间档次就下来了,于是改用转Map 然后循环标准列表 get取值,转List直接 (ArrayList) object 强转,10s大概能算到400条,当然本地测试会有误差,但是也说明些问题。最后,个体使用不具有全面性,适合自己的才是最好的。