You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Stream嵌套可空列表枚举过滤统计空指针问题求解

错误产生原因

你的代码出现空指针有两个核心触发点:

  • 没有先对itt.getInscricaoTipoTrabalhoAutores()的返回值做非空校验就直接调用了.stream()方法。如果该嵌套列表返回null,直接调用实例方法会直接抛出空指针。你最初的可行写法是先将该嵌套列表传入Optional.ofNullable()做非空包装,错误写法将流操作、过滤、收集逻辑直接写在Optional.ofNullable()的入参中,相当于完全绕开了非空校验。
  • 额外风险:如果tta.getAutorCoautor()返回null,调用equals()方法也会触发空指针。

正确实现方案

写法1(和你原代码逻辑对齐,兼容返回int类型)

listaInscricaoTipoTrab.stream()
    .mapToInt(itt -> Optional.ofNullable(itt.getInscricaoTipoTrabalhoAutores())
        .map(autores -> autores.stream()
            // 用枚举值调用equals,避免getAutorCoautor返回null时空指针
            .filter(tta -> AutorCoautor.AUTOR.equals(tta.getAutorCoautor()))
            // 直接统计数量,无需额外生成集合对象
            .count()
        )
        .orElse(0L)
        .intValue()
    )
    .sum();

写法2(更简洁的flatMap拍平写法,返回long类型)

如果接受long类型的返回结果,可以用更简洁的拍平流写法:

long total = listaInscricaoTipoTrab.stream()
    .flatMap(itt -> Optional.ofNullable(itt.getInscricaoTipoTrabalhoAutores())
        .map(List::stream)
        .orElseGet(Stream::empty)
    )
    .filter(tta -> AutorCoautor.AUTOR.equals(tta.getAutorCoautor()))
    .count();

需要int类型的话直接调用(int) total强转即可。

内容的提问来源于stack exchange,提问作者Romeu Fernandes Bessa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:04