STREAM流中Long型参数为空时的判断失效问题

这几天好累好累啊 主要是因为前后联调和新任务 搞得我晕头转向的 但是在项目中构建功能时 我发现了一个问题 就是在stream流中 对Long型数据进行判断操作时 会出现无效的情况 下面详细说明此次情况
情景:进行机构-菜单树的数据查询时,需要根据pid判断该菜单是否为顶级菜单,此时pid为null
下面是生成菜单树的方法,在实际情况下,当pid为null时,if中的条件永远为false,即逻辑符号‘||’左右的条件均为假。

private List<UdcMenuVo> treeUtil(List<UdcMenuVo> menuVos, Long pid) {
        List<UdcMenuVo> treeList = new ArrayList<>();
        menuVos.forEach(menu -> {
            if (null == pid || pid.equals(menu.getPid())) {
                menu.setList(treeUtil(menuVos, menu.getMenuId()));
                treeList.add(menu);
            }
        });
        return treeList;
    }

在查询出来的数据中虽然形成了树结构,但是没有过滤掉非顶级菜单,于是我又写了一个stream流的过滤,准备将非顶级菜单过滤掉,但是这样根本无法过滤,仍然无效。

List<UdcMenuVo> tree = menuVos.stream().filter(s->s.getPid() == null)
									.collect(Collectors.toList());

最后我在将机构和菜单组合时使用for循环连接,其中的if条件使用如下,此时的判断才过滤掉非顶级菜单,真是日了狗了。

if (udcMenuVo.getBranchCode().equals(udcBranchVo.getBranchCode()) 
								&& null == udcMenuVo.getPid()) 

对于为什么在stream流中Long类型的数据为空时的判断会失效,我也是一脸懵,暂时没有找到答案,也恳请知道缘由的大佬能指点我一下,感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
合成源码程 1.合成函数 --merge_with_h264() 2.程 1)初始化重要参数值见下表 序号 参数 代表意思 1 got_video 标志位,合成TS流中是否有视频;有为TRUE,否则false 2 got_audio 标志位,合成TS流中是否有音频;有为TRUE,否则false 3 prog_pids[] 音视频PID,都有取2个,只有视频或音频取1。 4 prog_type[] 音视频,都有取2个;如只要视频H264码则 prog_type[0] = AVC_VIDEO_STREAM_TYPE;(0x1B) 2.取音频prog_type[]的值 代码: switch (audio_type) { case AUDIO_ADTS: case AUDIO_ADTS_MPEG2: case AUDIO_ADTS_MPEG4: prog_type[1] = ADTS_AUDIO_STREAM_TYPE; break; case AUDIO_L2: prog_type[1] = MPEG2_AUDIO_STREAM_TYPE; break; case AUDIO_AC3: prog_type[1] = ATSC_DOLBY_AUDIO_STREAM_TYPE; break; default: // what else can we do? prog_type[1] = ADTS_AUDIO_STREAM_TYPE; break; } 3连续写出八个TS空包------ write_TS_null_packet(TS_writer_poutput) 代码 write_TS_null_packet(TS_writer_p output) { byte TS_packet[TS_PACKET_SIZE]; int err, ii; TS_packet[0] = 0x47; TS_packet[1] = 0x1F; // PID is 0x1FFF TS_packet[2] = 0xFF; TS_packet[3] = 0x20; // payload only for (ii=4; ii<TS_PACKET_SIZE; ii++) TS_packet[ii] = 0xFF; err = write_TS_packet_parts(output,TS_packet,TS_PACKET_SIZE,NULL,0,NULL,0,0x1FF,FALSE,0); if (err) { fprintf(stderr,"### Error writing null TS packet\n"); return 1; } return 0; }<span style="font-weight: bold;"> </span> 注:空包包头 0x47 0x1F 0xFF 0x20 包数据全为0xff。包长188个字节 4.为多种类(音频、视频)写出pat和PMT--- write_TS_program_data2() 具体如何写参考write_pat_and_pmt()、append_to_pidint_list()等函数 5.判断got_video 、got_audio是否为true(即是否任何一个存在),存在在进行循环合成 while (got_video || got_audio) { ...... } 6.具体合成 具体合成分两步:1. write_TS_program_data2()----------------写出PMT和PAT 2.根据H264码的帧类(I帧和非I帧),添加PTS/DTS和pcr 代码如下: <strong> </strong> if (is_I_or_IDR_frame(access_unit)) //判断是否是I帧,I帧则pts/dts ;否则打pcr err = write_access_unit_as_TS_with_pts_dts(access_unit,video_context, output,DEFAULT_VIDEO_PID, TRUE,video_pts+45000, TRUE,video_pts);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值