Collection<List<Object>> 求总和
时间: 2023-08-10 16:03:12 浏览: 84
假设每个 List<Object> 中都是数字类型,可以使用以下代码计算总和:
```
Collection<List<Object>> collection = ...; // 假设这是你的 Collection
int sum = 0;
for (List<Object> list : collection) {
for (Object obj : list) {
if (obj instanceof Number) {
sum += ((Number) obj).intValue();
}
}
}
System.out.println("总和为:" + sum);
```
上述代码通过两层循环遍历 Collection 中的每个 List<Object>,再通过 instanceof 判断元素是否为数字类型,如果是则加到 sum 中。最后输出总和。需要注意的是,如果 List<Object> 中存在非数字类型的元素,上述代码会抛出 ClassCastException 异常,需要根据实际情况进行处理。
相关问题
vo类 public class ArealRainfallVo implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "区域编码") private String code; @ApiModelProperty(value = "雨量总和") private BigDecimal value; } Mapper类 public interface WeightBetweenObjectAndRainfallStationMapper extends BaseMapper<WeightBetweenObjectAndRainfallStation> { List<ArealRainfallVo> ListbySumList (List<PointRainfallSumVO> list); } mapper配置类 <mapper namespace="com.ndwp.jboot.bootstrap.mapper.WeightBetweenObjectAndRainfallStationMapper"> <select id="ListbySumList" resultType="com.ndwp.jboot.bootstrap.entity.vo.ArealRainfallVo"> SELECT code, SUM(CASE <foreach collection="list" item = "item"> WHEN rainfall_station_code = '${item.getCode()}' THEN weight * ${item.getValue()} </foreach> END ) AS value FROM bootstrap.weight_between_object_and_rainfall_station GROUP BY code; </select> </mapper> 服务类 public interface IWeightBetweenObjectAndRainfallStationService extends BaseService<WeightBetweenObjectAndRainfallStation> { List<ArealRainfallVo> listAreaRainfall(Date start, Date end); } 服务实现类 @Service public class WeightBetweenObjectAndRainfallStationServiceImpl extends BaseServiceImpl<WeightBetweenObjectAndRainfallStationMapper, WeightBetweenObjectAndRainfallStation> implements IWeightBetweenObjectAndRainfallStationService { @Autowired IDataHistoricRainfallService dataHistoricRainfallService; @Override public List<ArealRainfallVo> listAreaRainfall(Date start, Date end) { List<PointRainfallSumVO> pointRainfallSumVOS = dataHistoricRainfallService.listAllPointRainfallByTime(start, end); return baseMapper.ListbySumList(pointRainfallSumVOS); } } 控制台打印的sql语句能够正常运行,结合代码分析一下为何会返回四个空对象?
根据你提供的代码,我注意到你在mapper配置文件中使用了foreach循环来动态生成SQL语句中的条件部分。然而,你在foreach循环中使用了`${item.getCode()}`和`${item.getValue()}`来获取集合中每个元素的属性值,这是不正确的。
在MyBatis中,`${}`语法用于替换普通的字符串,它不会对参数进行预处理或转义。所以在你的SQL语句中,`${item.getCode()}`和`${item.getValue()}`会被直接替换为对应元素的`getCode()`和`getValue()`方法的返回值,而不是参数值。
为了修复这个问题,你可以改用`#{}`语法来将参数作为预处理参数传递给SQL语句。修改后的mapper配置文件如下所示:
```xml
<mapper namespace="com.ndwp.jboot.bootstrap.mapper.WeightBetweenObjectAndRainfallStationMapper">
<select id="ListbySumList" resultType="com.ndwp.jboot.bootstrap.entity.vo.ArealRainfallVo">
SELECT code, SUM(CASE
<foreach collection="list" item="item" separator=" ">
WHEN rainfall_station_code = #{item.code} THEN weight * #{item.value}
</foreach> END ) AS value
FROM bootstrap.weight_between_object_and_rainfall_station
GROUP BY code;
</select>
</mapper>
```
修改后重新运行代码,应该能够正确地获取到数据库中的数据并返回非空对象。
有个paymentTime,为String类型,为yyyy-MM-dd HH:mm:ss格式,记录了时间信息,在List<Orders> ordersList=ordersService.list()得到总list之后,怎么按照今年的时间划分成12个月的order_price的总和,并用CollUtil.newArrayList将每个月order_price的总和输出,代码简单一点
可以按照以下步骤来实现:
1. 定义一个长度为12的数组,用来保存每个月份的订单金额总和。
2. 遍历订单列表ordersList,将每个订单的订单金额累加到对应月份的数组元素中。
3. 最后将每个月份的订单金额总和封装成一个Map,添加到List中。
4. 使用CollUtil.newArrayList方法将List输出。
下面是代码示例:
```java
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.google.common.collect.Maps;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class OrderUtils {
public static List<Map<String, Object>> groupByMonth(List<Orders> ordersList) {
BigDecimal[] monthArray = new BigDecimal[12];
for (int i = 0; i < 12; i++) {
monthArray[i] = BigDecimal.ZERO;
}
for (Orders orders : ordersList) {
Date paymentTime = DateUtil.parse(orders.getPaymentTime(), "yyyy-MM-dd HH:mm:ss");
int month = DateUtil.month(paymentTime);
BigDecimal orderPrice = new BigDecimal(orders.getOrderPrice());
monthArray[month] = monthArray[month].add(orderPrice);
}
List<Map<String, Object>> result = new ArrayList<>();
for (int i = 0; i < 12; i++) {
Map<String, Object> map = Maps.newHashMap();
map.put("month", i + 1);
map.put("orderPrice", monthArray[i]);
result.add(map);
}
return result;
}
}
```
在上面的代码中,groupByMonth方法接收一个订单列表ordersList作为参数,返回一个List<Map<String, Object>>,其中每个Map保存了月份和订单金额总和。我们使用了Hutool和Guava库提供的工具类来简化代码,例如Hutool的DateUtil和CollUtil,Guava的Maps。
阅读全文