当前位置: 首页 > news >正文

判断 java 8 Set null 和 非空 但是size()=0

在 Java 8 中,判断一个Set是否为null、是否为空集(size() == 0)但非null,核心就是分两步走:先判断是否为null,再判断是否为空。


一、常见写法

最常用:双重判空(安全写法)

java

Set<Long> set = getSet(); if (set == null) { System.out.println("Set 是 null(对象不存在)"); } else if (set.isEmpty()) { System.out.println("Set 非 null,但是空集(size = 0)"); } else { System.out.println("Set 非 null,且有元素,size = " + set.size()); }

一行式判空(适用于需要快速确认是否有数据)

java

if (set != null && !set.isEmpty()) { // 有数据 } else { // 无数据(可能是 null 也可能是 empty) }

二、nullvsempty行为对比

状态代码示例set == nullset.isEmpty()可安全调用
nullSet<Long> set = null;✅ true❌ 抛 NPE
空集Set<Long> set = new HashSet<>();❌ false✅ true
有元素Set<Long> set = new HashSet<>(Arrays.asList(1L, 2L));❌ false❌ false

三、实际应用场景

场景1:方法返回 Set,调用方安全使用

java

public void processIds(Set<Long> ids) { // 防御性编程:先判 null,再判空 if (ids == null || ids.isEmpty()) { System.out.println("没有数据需要处理"); return; } for (Long id : ids) { System.out.println("处理: " + id); } }

场景2:从数据库查询返回的 Set

java

Set<Long> orderIds = orderService.findOrderIdsByUser(userId); // 很多框架(如 Spring Data JPA、MyBatis)查询不到数据时返回空集合,而不是 null if (orderIds.isEmpty()) { System.out.println("该用户没有订单"); } else { System.out.println("共有 " + orderIds.size() + " 个订单"); }

场景3:结合你之前的 Feign 调用场景

java

Set<Long> organizationIds = organizationService.getOrgIds(); // 判断是否为空集 if (organizationIds != null && !organizationIds.isEmpty()) { // 传入 SQL 的 IN 子句 sql.append("AND organization_id IN (:organizationIds)"); query.setParameter("organizationIds", organizationIds); } else { // 不添加 IN 条件,避免生成 IN () 导致 SQL 错误 }

四、工具类封装(推荐)

如果项目中频繁判空,可以用 Hutool 或自定义工具类:

使用 Hutool(你项目已引入)

java

import cn.hutool.core.collection.CollUtil; if (CollUtil.isNotEmpty(organizationIds)) { // 非 null 且非空 }

自定义工具类

java

public class CollectionUtils { public static boolean isEmpty(Set<?> set) { return set == null || set.isEmpty(); } public static boolean isNotEmpty(Set<?> set) { return !isEmpty(set); } } // 使用 if (CollectionUtils.isNotEmpty(organizationIds)) { // 有数据 }

五、nullvsempty的最佳实践

原则说明
方法返回值优先返回空集合(如Collections.emptySet()),而不是null,减少调用方判空负担
方法入参如果业务不允许null,用@NotNull注解 + 提前校验,或在方法内判空
SQL 拼接传入IN子句前,务必检查!set.isEmpty(),避免生成IN ()导致语法错误
使用工具类统一用CollUtil.isNotEmpty(set)等工具方法,代码更简洁

六、总结

需要判断的场景推荐写法
需要区分 null 和 emptyif (set == null) { ... } else if (set.isEmpty()) { ... }
只关心是否有数据if (set != null && !set.isEmpty()) { ... }
使用 Hutoolif (CollUtil.isNotEmpty(set)) { ... }
SQL 传入 IN 前判断if (set != null && !set.isEmpty()) { sql.append("... IN (:ids)"); }

关键点nullempty是两种完全不同的状态:

  • null:对象不存在,调用任何方法都会抛 NPE

  • empty:对象存在,但无元素,isEmpty()返回true

http://www.jsqmd.com/news/1274729/

相关文章:

  • 2026年新发现:无异味硅油,让生活更清新自然 - 品牌优选官
  • 深入解析TI处理器架构:从ALU到缓存,嵌入式开发实战指南
  • CxImage图像库实战指南:从环境搭建到核心API与性能优化
  • AI写作保持人味的终极平衡术(人机协同写作黄金比例公式首次公开)
  • 从LMK3H2108EVM评估板解析高速时钟电路PCB布局与BOM选型核心要点
  • 2026.7月贵港房屋渗漏维修指南|厨卫、屋顶、外墙、阳台漏水针对性处理+避坑干货 - 超人防水
  • Claude与Codex语音功能对比:AI语音交互技术选型指南
  • TMS320F240 DSP软件死区实现:驱动双逆变器的资源扩展方案
  • 包络追踪技术解析:LM3291如何提升射频功率放大器效率
  • 人类意识本质:生物大模型假说的新视角
  • 如何在3分钟内搭建B站视频解析服务:专业工具使用指南
  • VMware Unlocker终极指南:在普通PC上解锁macOS虚拟化功能
  • 初创团队智能体技术应用指南与架构解析
  • 【飞书智能伙伴实战指南】:20年IT专家亲授,5步打造专属AI工作流
  • 2026.7月安顺房屋渗漏维修指南 厨卫屋顶外墙阳台漏水针对性处理+避坑干货 - 超人防水
  • Pixeval终极指南:如何快速掌握这款免费高效的Pixiv第三方客户端?
  • DRV88xx步进电机高细分微步进零电流非线性优化实战
  • 长周期AI Agent开发:双架构设计与状态恢复实践
  • 3步搞定黑苹果:OpCore-Simplify让OpenCore配置变得如此简单
  • 第44篇:Vue3侦听器完全精讲——watch与watchEffect区别、深度监听、异步业务落地
  • 为什么你的天工AI搜索QPS卡在800?揭秘官方未公开的4级限流机制与5种绕过合规方案(含压测日志原始截图)
  • 2026 登封少林小龙武术学校招生全指南|办学资质查询入口、学费、报名条件汇总 - Luckyone王
  • GPA-v1.5 ONNX Runtime使用教程:CLI工具、浏览器UI与语音注册全流程
  • 如何快速安装Claude Desktop中文界面:3步免费汉化补丁完整指南
  • 基于U-Net的乳腺癌病理图像分割技术实践
  • MySQL JDBC SSL加密配置与避坑指南
  • 2026 东莞深圳旧卡板回收、胶合板木箱采购,外贸工厂省钱思路 - LYL仔仔
  • AI长篇内容生成失效真相(2024行业压力测试数据首次公开)
  • so-vits-svc与RVC深度对比:歌声转换技术路线选型指南
  • MSP430与LMP91000 I2C通信代码库实战:从移植到故障排查