使用 Stream 流筛选掉空数据并合并节点窗口起终点相同的数据,然后List<xxxDo> overhaulTaskDoList转换为List<xxxVo>

结果

记录一下stream流的使用心得,一共写了两种方式。第一种用stream流的Collectors的groupby()。第二种是Collections的map()。贴代码,第一段是代码,第二段是结果

package com.huang.grpceasy;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

class OverhaulTaskDo {
    private int id;
    private Integer nodeWindowStart;
    private Integer nodeWindowEnd;

    public OverhaulTaskDo(int id, Integer nodeWindowStart, Integer nodeWindowEnd) {
        this.id = id;
        this.nodeWindowStart = nodeWindowStart;
        this.nodeWindowEnd = nodeWindowEnd;
    }

    public int getId() {
        return id;
    }

    public Integer getNodeWindowStart() {
        return nodeWindowStart;
    }

    public Integer getNodeWindowEnd() {
        return nodeWindowEnd;
    }
}
class OverhaulTaskVo {

    private Integer nodeWindowStart;
    private Integer nodeWindowEnd;

    public OverhaulTaskVo(Integer nodeWindowStart, Integer nodeWindowEnd) {
        this.nodeWindowStart = nodeWindowStart;
        this.nodeWindowEnd = nodeWindowEnd;
    }
    public Integer getNodeWindowStart() {
        return nodeWindowStart;
    }

    public Integer getNodeWindowEnd() {
        return nodeWindowEnd;
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        OverhaulTaskVo that = (OverhaulTaskVo) o;
        return Objects.equals(nodeWindowStart, that.nodeWindowStart) && Objects.equals(nodeWindowEnd, that.nodeWindowEnd);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nodeWindowStart, nodeWindowEnd);
    }

    @Override
    public String toString() {
        return "OverhaulTaskVo{" +
                "nodeWindowStart=" + nodeWindowStart +
                ", nodeWindowEnd=" + nodeWindowEnd +
                '}';
    }
}
public class Main {
    public static void main(String[] args) {
        List<OverhaulTaskDo> overhaulTaskDoList = new ArrayList<>();
        overhaulTaskDoList.add(new OverhaulTaskDo(1, 1, 2));
        overhaulTaskDoList.add(new OverhaulTaskDo(2, 2, 2));
        overhaulTaskDoList.add(new OverhaulTaskDo(3, null, null));
        overhaulTaskDoList.add(new OverhaulTaskDo(4, 1, 2));
        overhaulTaskDoList.add(new OverhaulTaskDo(5, 3, 4));
        overhaulTaskDoList.add(new OverhaulTaskDo(6, 2, 2));

        // 使用 Stream 流筛选掉空数据并合并节点窗口起终点相同的数据,然后List<OverhaulTaskDo> overhaulTaskDoList转换为List<OverhaulTaskVo>
        List<OverhaulTaskVo> collect = overhaulTaskDoList.stream()
                .filter(taskDo -> Optional.ofNullable(taskDo.getNodeWindowStart()).isPresent() && Optional.ofNullable(taskDo.getNodeWindowEnd()).isPresent() )
//方式一:
 // 筛选掉空数据
//                .collect(Collectors.groupingBy(
//                        task -> task.getNodeWindowStart() + "-" + task.getNodeWindowEnd(),
//                        Collectors.collectingAndThen(Collectors.toList(), list -> {
//                            // 只需要合并后的第一个对象即可
//                            OverhaulTaskDo firstTask = list.get(0);
//                            return new OverhaulTaskVo(firstTask.getNodeWindowStart(), firstTask.getNodeWindowEnd());
//                        })
//                )).values().stream()
//                .collect(Collectors.toList());
//方式二:
                .collect(Collectors.toMap(
                        task -> task.getNodeWindowStart() + "-" + task.getNodeWindowEnd(),
                        task -> task,
                        (existing, replacement) -> existing // 合并逻辑,保留已存在的对象
                )).values().stream()
                .map(task -> new OverhaulTaskVo(task.getNodeWindowStart(), task.getNodeWindowEnd()))
                .collect(Collectors.toList());
        System.out.println("合并后的数据:"+collect);
        for (OverhaulTaskVo taskDo : collect) {
            System.out.println("Node Window Start: " + taskDo.getNodeWindowStart() + ", Node Window End: " + taskDo.getNodeWindowEnd());
        }


}}
合并后的数据:[OverhaulTaskVo{nodeWindowStart=1, nodeWindowEnd=2}, OverhaulTaskVo{nodeWindowStart=2, nodeWindowEnd=2}, OverhaulTaskVo{nodeWindowStart=3, nodeWindowEnd=4}]
Node Window Start: 1, Node Window End: 2
Node Window Start: 2, Node Window End: 2
Node Window Start: 3, Node Window End: 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值