可能大伙儿经常遇到一些需要计算的字段,但是处理起来又听麻烦的,我这边正好整理了一点点,随便发一发
private static Map<String, BigDecimal> objectToMap(Object obj) {
Map<String, BigDecimal> map = new HashMap<>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
if (field.get(obj) != null) {
map.put(field.getName(), (BigDecimal) field.get(obj));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
这个方法是通过反射的技术将实体类转换成map的方式,因为我这边为了方便计算加了判空,是空的数据我这边不会放入map中,BIgDecimal类型对null非常不友好。当然如果为了保全数据的话,null也是可以放的,将判空去掉就行。
private static Map<String, BigDecimal> objectToMap(Object obj) {
Map<String, BigDecimal> map = new HashMap<>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), (BigDecimal) field.get(obj));
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
然后呢,为了方便运算的话,建议直接转list->
List<BigDecimal> list= new ArrayList<>(map.values());
开始计算的话直接怼stream即可
其中列举几个常规计算方式(去重计数,累加,取最大值。。。)
//统计去重计数
list.stream().filter(o -> o.getName() != null).map(object::getName).distinct().count();
//统计累加
list.stream().filter(o -> o.getElecutionTime() != null).map(object::getElecutionTime).reduce(BigDecimal.ZERO, BigDecimal::add);
//如果返回值是int直接sum即可
list.stream().filter(o -> o.getCount() != null).mapToInt(Student::getCount).sum();
//取最大值
list.stream().filter(o ->o.getMaxPeakLoad() != null).map(OrgOneEvaluation::getMaxPeakLoad).max(BigDecimal::compareTo).orElse(new BigDecimal("0"));
//简单过滤
orgOneEvaluations.stream().filter(
item -> maxLoad.equals(item.getMaxPeakLoad())
).findFirst().orElse(new OrgOneEvaluation()).getEndDate();
这样写的好处就是方便对集合数据进行处理当然一定会有更好的方法,这里就不提了