Java List根据列计算合计行对象,List根据对象每列列求和返回合计对象,List多列求和得到合计对象
–根据传入的数据集合将集合中对象的指定属性(需为BigDecimal或String类型)进行加和
该方法有异常就会抛出
/**
* 根据传入的数据集合将集合中对象的指定属性(需为BigDecimal或String类型)进行加和
*
* @Author csdn weixin_43620015
* @param dataList 数据集合
* @param clazz 对象类
* @param excludeList 不需要加和的字段属性名字
* @param <T>
* @return 合计对象
* @throws Exception
*/
public static <T> T getSumByList(List<T> dataList, Class<T> clazz, List<String> excludeList) throws Exception {
Map<String, BigDecimal> map = new HashMap<>();
//遍历数据集合
for (T t : dataList) {
Field[] declaredFields = clazz.getDeclaredFields();
//获取对象的所有属性
for (Field field : declaredFields) {
if (excludeList == null) throw new RuntimeException("不能为null,至少为空集合");
String name = field.getName();
if (excludeList.contains(name)) continue;
field.setAccessible(true);
//如果计算总值的map已经包含该字段则直接获取
if (map.containsKey(name)) {
Object o = field.get(t);
if (ObjectUtils.isEmpty(o)) continue;
if (o instanceof BigDecimal) {
map.put(name, map.get(name).add((BigDecimal) o));
} else if (o instanceof String) {
map.put(name, map.get(name).add(Str2Decimal((String) o)));
} else {
throw new IllegalAccessException("不为BigDecimal或String类型");
}
} else {
//否则初始化,Author方糖不要盐
Object o = field.get(t);
if (ObjectUtils.isEmpty(o)) {
map.put(name, BigDecimal.ZERO);
}
if (o instanceof BigDecimal) {
map.put(name, (BigDecimal) o);
} else if (o instanceof String) {
map.put(name, Str2Decimal((String) o));
}
}
}
}
return mapToObject(map, clazz);
}
//String 转BigDecimal
public static BigDecimal Str2Decimal(String str) {
if (ObjectUtils.isEmpty(str)) {
return BigDecimal.ZERO;
} else {
try {
return new BigDecimal(str.trim());
} catch (NumberFormatException e) {
throw new RuntimeException("数据不为BigDecimal或String:" str);
}
}
}
//map集合转对象,@Author csdn weixin_43620015
private static <T> T mapToObject(Map<String, BigDecimal> map, Class<T> clazz) throws Exception {
if (map == null) {
return null;
}
T obj = clazz.getDeclaredConstructor().newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
Method setter = property.getWriteMethod();
if (setter != null) {
BigDecimal o = map.get(property.getName());
if (o != null) {
setter.invoke(obj, o.toString());
}
}
}
return obj;
}
//以下为测试类和测试方法
static class TestDto {
private Integer id;
private String jsdw;
private String cj;
private String sblysDmnz;
private String sblysDmwz;
private String sblysSmnz;
private String sblysSmwz;
private String sblysRru;
private String sblysSp;
private String sblysDp;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getJsdw() {
return jsdw;
}
public void setJsdw(String jsdw) {
this.jsdw = jsdw;
}
public String getCj() {
return cj;
}
public void setCj(String cj) {
this.cj = cj;
}
public String getSblysDmnz() {
return sblysDmnz;
}
public void setSblysDmnz(String sblysDmnz) {
this.sblysDmnz = sblysDmnz;
}
public String getSblysDmwz() {
return sblysDmwz;
}
public void setSblysDmwz(String sblysDmwz) {
this.sblysDmwz = sblysDmwz;
}
public String getSblysSmnz() {
return sblysSmnz;
}
public void setSblysSmnz(String sblysSmnz) {
this.sblysSmnz = sblysSmnz;
}
public String getSblysSmwz() {
return sblysSmwz;
}
public void setSblysSmwz(String sblysSmwz) {
this.sblysSmwz = sblysSmwz;
}
public String getSblysRru() {
return sblysRru;
}
public void setSblysRru(String sblysRru) {
this.sblysRru = sblysRru;
}
public String getSblysSp() {
return sblysSp;
}
public void setSblysSp(String sblysSp) {
this.sblysSp = sblysSp;
}
public String getSblysDp() {
return sblysDp;
}
public void setSblysDp(String sblysDp) {
this.sblysDp = sblysDp;
}
}
public static void main(String[] args) throws Exception {
List<TestDto> list = new ArrayList<>();
TestDto fill = new TestDto();
fill.setId(1);
fill.setJsdw("第一单位");
fill.setCj("第一单位下部门");
fill.setSblysDmnz("112");
fill.setSblysDmwz("0");
fill.setSblysSmnz("215");
fill.setSblysSmwz("10");
fill.setSblysRru("78");
fill.setSblysSp("");
fill.setSblysDp("60");
list.add(fill);
TestDto fill1 = new TestDto();
fill.setId(2);
fill1.setJsdw("第二单位");
fill1.setCj("第二单位下部门");
fill1.setSblysDmnz("1094");
fill1.setSblysDmwz("239");
fill1.setSblysSmnz("7357");
fill1.setSblysSmwz("544");
fill1.setSblysRru("17");
fill1.setSblysSp("");
fill1.setSblysDp("58");
list.add(fill1);
List<String> excludeList = new ArrayList<>();
excludeList.add("id");
excludeList.add("jsdw");
excludeList.add("cj");
TestDto sumByList = getSumByList(list, TestDto.class, excludeList);
sumByList.setId(0);
sumByList.setJsdw("总计");
//输出合计对象,对象中除excludeList中的其余均被加和
System.out.println(JSONObject.toJSONString(sumByList));
}
–2022年9月28日 10:05:44–优化异常处理,如果在循环属性的时候发生异常则会跳过该属性
/**
* 根据传入的数据集合将集合中对象的除指定属性外的其他属性全部加和,并返回该对象(需为BigDecimal或String类型)
*
* @param dataList 数据集合
* @param clazz 对象类
* @param excludeList 不需要加和的字段属性名字
* @param <T>
* @return
* @throws Exception
* @Author Fy
* @Date 2022年9月20日 17:36:48
*/
public static <T> T getSumByList(List<T> dataList, Class<T> clazz, List<String> excludeList) throws Exception {
Map<String, BigDecimal> map = new HashMap<>();
Field[] declaredFields = clazz.getDeclaredFields();
//遍历数据集合
for (T t : dataList) {
//获取对象的所有属性
for (Field field : declaredFields) {
if (excludeList == null) throw new RuntimeException("不能为null,至少为空集合");
try {
String name = field.getName();
if (excludeList.contains(name)) continue;
field.setAccessible(true);
//如果计算总值的map已经包含该字段则直接获取
if (map.containsKey(name)) {
Object o = field.get(t);
if (ObjectUtils.isEmpty(o)) continue;
if (o instanceof BigDecimal) {
map.put(name, map.get(name).add((BigDecimal) o));
} else if (o instanceof String) {
map.put(name, map.get(name).add(Str2Decimal((String) o)));
} else {
//throw new IllegalAccessException("不为BigDecimal或String类型");
log.info("不为BigDecimal或String类型,已跳过");
}
} else {
//否则初始化
Object o = field.get(t);
if (ObjectUtils.isEmpty(o)) {
map.put(name, BigDecimal.ZERO);
}
if (o instanceof BigDecimal) {
map.put(name, (BigDecimal) o);
} else if (o instanceof String) {
map.put(name, Str2Decimal((String) o));
}
}
} catch (Exception e) {
//出异常则跳过该属性
log.info("发生异常跳过属性" field.getName());
log.error("", e);
}
}
}
return mapToObject(map, clazz);
}
/**
* map集合转对象,上面方法中专用
*
* @param map
* @param clazz
* @param <T>
* @return
* @throws Exception
*/
private static <T> T mapToObject(Map<String, BigDecimal> map, Class<T> clazz) throws Exception {
if (map == null) {
return null;
}
T obj = clazz.getDeclaredConstructor().newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
Method setter = property.getWriteMethod();
if (setter != null) {
BigDecimal o = map.get(property.getName());
if (o != null) {
setter.invoke(obj, o.toString());
}
}
}
return obj;
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiabbbe
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22