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
相关产品推荐
相关产品推荐

