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

Cursor Cloud Agent:云原生编程工作流的底层重构 编程工作流正从本地计算范式转向云原生执行范式。Cloud Agent 本质是将代码理解、生成、执行与调试等核心能力下沉至隔离、可控、按需分配的云端虚拟机,通过 Firecracker 微虚拟机实现亚秒级启动,并依托上下文快照、环境镜像化和内核级沙箱保障一致性、算力弹性与数据安全。这一范式突破了传统本地 AI 编程助手在环境依赖、调试能力与企业合规上的根本局限,使 IDE 从编辑工具升维为分布式开发指挥中心。本文深入解析其运行机制与工程落地实践。 阅读详情

结果

记录一下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

华大HC32F460从零到200MHz:手把手教你配置时钟系统(附避坑指南) 本文详细解析了华大HC32F460 MCU的时钟系统配置,从启动过程、时钟树分析到实战配置200MHz系统时钟。文章手把手指导开发者如何正确配置外部晶振、MPLL锁相环及总线分频,并提供了硬件检查、代码解读及常见问题排查的避坑指南,帮助用户从零构建稳定可靠的高性能时钟环境。 阅读详情

相关推荐

3D Slicer肺部CT病灶体积测量:阈值法实操全流程

在医学影像分析中,病灶体积的精准测量是肿瘤评估、疗效随访和科研统计的重要基础。传统逐层手动勾画不仅耗时,且主观差异大,而基于CT值的阈值分割技术,通过设定灰度区间自动提取目标体素,能够快速生成三维分割结果,具有高效、可重复、边界标准统一的优势,尤其适用于肺部实性结节这类与周围肺实质对比度高的病灶。理解体素与CT值的关系,掌握阈值范围的设定逻辑,并配合连通域分析、边缘修正等工程化操作,即可在3D Slicer中稳定获得可靠的体积数据。本文从技术原理出发,系统梳理了DICOM导入、窗宽窗位调节、阈值选择、三维重

weixin_29050271的博客 253

Java List Stream流操作实战教学,轻松分组、合并、筛选、拼接、拆分、替换,复制可用!

今日无事,记录下常用的一些Stream流操作。很多案例只是提供思路,活学活用!废话不多说直接上干货!

Su7148的博客 6127

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1049

Collectors.groupingBy 判空

需求就是对empName进行分组,如果empName有值就返回他的值作为key, 如果没有值就返回"园区"作为key.用Collectors.groupingBy 对可能为空的字段分组时,如果数据中对应的字段有空值的话会报空指针异常。所以在Collectors.groupingBy()方法中要对字段进行处理。

weixin_66204660的博客 2325

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1015

深入解析JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略

本文深入探讨了JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略,针对雷达阵列和宽带通信系统中的同步精度问题,详细解析了硬件实现细节、参数配置实战经验及系统级优化方法。通过案例分析和技术要点,帮助工程师解决由温度漂移和时钟抖动引起的同步挑战,提升系统性能。

weixin_29267307的博客 138

Java List Stream流,去空,字段赋值,去重

Java List Stream流,去空,字段赋值,去重 1.实体类 /** * @description 用户 * @author ln */ @Data public class User { private String id; private String name; private String nickname; private String sex; private String age; private String type; }

weixin_44414188的博客 1万+

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战

本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。

moon9的博客 705

Stream流

Stream流 Stream(流)是一个来自数据源的元素队列并支持聚合操作: 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而 是按需计算。 数据源 流的来源。 可以是集合,数组等。 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted 等。 1. Stream流操作的三个步骤: 创建Stream 一个数据源(如:集合、数组),获取一个流 中间操作 一个中间操作链,对数据源的数据进行处理 终

qq_43677736的博客 875

【AI智能体】Codex AI 辅助编程高级技能实战操作详解

Codex AI 辅助编程高级技能实战操作详解

congge 6762

利用baostock获取上市公司财务指标

利用baostock获取上市公司的财务指标 1、导入模块,登录baostock import baostock as bs import pandas as pd import time # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:'+lg.error_code) print('login respond error_msg:'+lg.error_msg) 2、查询股票代码、行业板块 # 查询股票代码 rs=.

firefox_yau的博客 2100

Java 8 – 从一个 Stream中过滤null值

  复习一个Stream 包含 null 数据的例子. Java8Examples.java   package com.mkyong.java8;   import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream;   ...

Jaylon Wang的专栏 4万+

网红商品数据抓取:基于Python的高效爬虫实战

本篇博客介绍了从爬取到存储、分析和可视化网红商品数据的完整流程。通过Python的强大生态,我们能够轻松完成复杂的数据抓取任务。在实际应用中,还可以将此爬虫与机器学习模型结合,进一步挖掘数据价值。

2201_76125261的博客 1478

stream 流过滤空元素

韩猿外的博客 4936

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?

第17课:用大白话讲清 list 的双向链表结构、哨兵头、push_back 四步、迭代器封装、merge 与 splice 的区别,以及 vector 排序为什么常比 list 快。

wo_jack的博客 251

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【C++】【STL】list_OJ题

本文系统解析了8道C++链表经典OJ题,按“算数操作”与“指针重连”分为两组,强调指针操作与数据结构解耦的重要性。通过手写ListNode、std::list及带头双向循环链表三类载体验证算法普适性,重点剖析空链、单节点、全相同值等6类边界情况,并给出统一编译与调试方案(g++11 + -Wall -O2),确保零告警、可追踪。所有题目时间复杂度均为O(N),常数差异源于遍历次数与操作开销,代码实现兼顾正确性与面试可用性。

这里是Cocatrice的博客,感谢大家一直以来的支持和鼓励,如果对C/C++方向感兴趣的话,可以通过主页的微信名片加Cocatrice的好友,也可以通过邮箱:Chen31980094@163.com 联系,一同加油! 1866

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 293

Redis 数据类型详解:Hash 哈希与 List 列表

大 key 指单个 key 对应的 value 过大(如 Hash 字段数极多、List 元素极多)。危害包括:单次全量命令(

2303_77004089的博客 125

Java 集合框架(List、Set、Map)与常用基础

本文整理Java集合框架核心知识,涵盖集合体系、Collection接口API、List(ArrayList、LinkedList、Vector)、Set(HashSet、TreeSet)、Map(HashMap、TreeMap、Hashtable)实现类原理、泛型、增强for循环、可变参数与工具类,并附核心易错点速查表。

既然你都点开这里了,那可以给我点个关注吗?可以吗?可以吗? 494

Bugku 326 Baby-heap1 题解:glibc 2.23 堆溢出到 FSOP 劫持 _IO_list_all(附完整 exp)

为什么 FSOP 在 2.23 这么好用?glibc 2.23 的_IO_FILE虚表调用没有 vtable 合法性检查是 2.24 才加入的),只要能把指向自己伪造的 FILE,就能让__overflow槽位指向任意函数。exit()一定会走因此把_mode置 0、置 1、置 0,就能进入;把fp首地址写成/bin/shsystem(fp)的参数就齐了。为什么用 fastbin attack 而不是?2.23 没有 tcache,fastbin 的fd。

kingx3的博客 243

List(下):LPOP / RPOP、BLPOP / BRPOP 与 LINDEX、LINSERT

这是《Redis C++ 实战笔记》系列的第 07 篇。上一篇是往列表里放,这一篇是往外拿——包括那个会"等"的弹出。

wbs_scy的博客 123

CListCtrl 第一列为什么不能居中

/ 你满怀期待写下这段代码m_list.InsertColumn(0, _T("序号"), LVCFMT_CENTER, 80);m_list.InsertColumn(1, _T("名称"), LVCFMT_LEFT, 160);m_list.InsertColumn(2, _T("数值"), LVCFMT_RIGHT, 100);运行后傻眼:第 1、2 列对齐完全正常,唯独索引 0 这一列,无论你写还是,文字永远靠左。反复调试、怀疑自己参数写错、怀疑扩展样式、怀疑资源模板,折腾半小时 ——

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 278

To-Do List 的「修改」功能与 CSS 定位

买牛奶</td><td index="1">写作业</td><td index="2">跑步

2401_89953644的博客 315

一个链表(Linked List)--为什么要用链表--deepseek

数组(如你定义的大盘子就像你在 FPGA 里例化了一块深度为 2500 的 BRAM。它必须是一块连续的、完整的内存。如果内存里全是碎片,凑不出 2500 个连续空位,数组就建立不起来。链表(Linked List)就像一堆散落在大街小巷的小仓库,每个仓库大小不固定,彼此不挨着。但是,每个仓库的门口都贴了一张小纸条,纸条上写着“下一个仓库的地址”。我们来画个图,这就是链表的核心——节点(Node)text。

AlibabaApple的博客 187

DOM增删改查与TodoList实战

拿到一个元素后,不用重新 ,可以直接通过它身上的关系属性找到亲戚。       parent         │   ┌──────┴──────┐ prevSibling   nextSibling         │       self         │   ┌───

2401_89953644的博客 228

【C++初阶】list使用及相关实现,思路顺滑流畅!

list使用及相关实现

Severus_black的博客 226
上一篇: List<String>转换成List<xxxDo>
下一篇: java工程需要计算农历大年初一
throwsExceptions54
博客等级 码龄5年 24粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值