1、通过stream比对新旧数据
//当前任务只有一个结束的轮询
CamasSurveyTaskDO newTaskDO = child.get(0);
//查询旧任务的资产
List<CamasTaskAssetIPDO> oldAssetIPDOs = assetService.selectByTaskid(taskDO.getId());
//查询最新轮询任务的资产
List<CamasTaskAssetIPDO> newAssetsDOs = assetService.selectByTaskid(newTaskDO.getId());
//旧
List<String> oldKey = oldAssetIPDOs.stream().map(assetIPDO -> {
StringBuffer sb = new StringBuffer();
sb.append(assetIPDO.getIp());
sb.append(",");
sb.append(assetIPDO.getPort());
sb.append(",");
sb.append(assetIPDO.getName());
sb.append(",");
sb.append(assetIPDO.getFiveTupleId());
return sb.toString();
}).collect(Collectors.toList());
//新
List<String> newKey = newAssetsDOs.stream().map(assetIPDO -> {
StringBuffer sb = new StringBuffer();
sb.append(assetIPDO.getIp());
sb.append(",");
sb.append(assetIPDO.getPort());
sb.append(",");
sb.append(assetIPDO.getName());
sb.append(",");
sb.append(assetIPDO.getFiveTupleId());
return sb.toString();
}).collect(Collectors.toList());
// 移除已存在的数据
newKey.removeAll(oldKey);
total += newKey.size();
2、通过stream求和(reduce((x, y) -> x + y).get())
result = assetService.selectByTaskidsGroupNameAndOrder(taskDoIds);
//求和
Integer sum = result.stream().map(RankingAssetsResVO::getTotal).reduce((x, y) -> x + y).get();
result.forEach(rankingAssetsResVO -> {
BigDecimal bigTotal = new BigDecimal(Double.toString(rankingAssetsResVO.getTotal().doubleValue()));
BigDecimal bigSum = new BigDecimal(Double.toString(sum.doubleValue()));
double v = (bigTotal.divide(bigSum, 2, RoundingMode.HALF_UP)).multiply(new BigDecimal(100.00)).doubleValue();
rankingAssetsResVO.setPercent(v);
});
<select id="selectByTaskidsGroupNameAndOrder" parameterType="list" resultType="com.lc.mono.module.camas.controller.admin.assetsOverview.vo.RankingAssetsResVO">
SELECT
tc.`name` assetsName,COUNT(tc.`name`) total
FROM camas_task_ip tip,camas_task_asset tc
WHERE
tc.ipid = tip.id
AND tc.deleted = 0
AND tip.deleted = 0
AND tc.`name` IS NOT NULL
<if test="taskDoIds != null and taskDoIds.size() > 0">
<foreach collection="taskDoIds" item="taskId" open="AND tip.task_id IN (" close=")" separator=",">
#{taskId}
</foreach>
</if>
GROUP BY tc.`name`
ORDER BY total DESC
LIMIT 0, 10
</select>
3、Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组
按照部门id分组:
List<List<AdminUserRespDTO>> collect = users.stream()
.collect(Collectors.groupingBy(x -> x.getDeptId()))
.entrySet().stream()
.map(e -> {
return e.getValue();
})
.collect(Collectors.toList());
返回数据:
Map<Long, List<AdminUserRespDTO>> collect = users.stream().collect(Collectors.groupingBy(AdminUserRespDTO::getDeptId));
Map<String, List<AdminUserRespDTO>> collect1 = users.stream().collect(Collectors.groupingBy(item -> item.getDeptId() + "_" + item.getNickname()));
更多用法参考:java8中的Collectors.groupingBy用法_兴国First的博客-CSDN博客_collectors.groupingby