Java Stream filter触发NullPointer 如何处理Type字段为空的过滤场景
问题根因
你遇到的空指针异常确实是Type字段为null导致的:当item.getType()返回null时,直接调用null.equals("N")会触发空指针。同时你后续map逻辑里的activePlan.contains(packetPlan.getType())如果传入null,也有可能触发空指针,取决于activePlan集合是否支持null元素。
修复方案
你的需求是筛选**Type不等于"N"**的记录,null值显然不等于"N",符合筛选条件,只需要调整filter的判断逻辑即可,推荐使用JDK内置的java.util.Objects.equals工具方法处理null场景,该方法会自动处理两个参数为null的情况,不会触发空指针。
修改后的完整代码
import java.util.Objects; // 其他已有导入保持不变 Collection<Plan> plan = packet.getPlan().stream() // 用Objects.equals处理null场景,避免空指针 .filter(item -> !Objects.equals(item.getType(), "N")) .map(packetPlan -> Plan.newInstance( packetPlan, // 如果activePlan不支持null元素,这里也可以加判断,比如: // packetPlan.getType() != null && activePlan.contains(packetPlan.getType()) activePlan.contains(packetPlan.getType()) )) .collect(Collectors.toList());
备选写法(不需要额外导入工具类)
如果你不想引入Objects工具类,也可以先判空再比较,效果完全一致:
.filter(item -> item.getType() == null || !item.getType().equals("N"))
注意事项
如果你的业务逻辑里Type为null的记录不需要保留,只需要筛选**有Type值且不等于"N"**的记录,可以把filter调整为:
.filter(item -> item.getType() != null && !item.getType().equals("N"))
此时后续map逻辑里的packetPlan.getType()一定不为null,也不会出现contains方法传入null的问题。
内容的提问来源于stack exchange,提问作者Deividas.r
相关产品推荐
相关产品推荐

