Stream相关操作

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值