=0)
在 Java 8 中判断一个Set是否为null、是否为空集size() 0但非null核心就是分两步走先判断是否为null再判断是否为空。一、常见写法最常用双重判空安全写法javaSetLong 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()); }一行式判空适用于需要快速确认是否有数据javaif (set ! null !set.isEmpty()) { // 有数据 } else { // 无数据可能是 null 也可能是 empty }二、nullvsempty行为对比状态代码示例set nullset.isEmpty()可安全调用nullSetLong set null;✅ true❌ 抛 NPE❌空集SetLong set new HashSet();❌ false✅ true✅有元素SetLong set new HashSet(Arrays.asList(1L, 2L));❌ false❌ false✅三、实际应用场景场景1方法返回 Set调用方安全使用javapublic void processIds(SetLong ids) { // 防御性编程先判 null再判空 if (ids null || ids.isEmpty()) { System.out.println(没有数据需要处理); return; } for (Long id : ids) { System.out.println(处理: id); } }场景2从数据库查询返回的 SetjavaSetLong orderIds orderService.findOrderIdsByUser(userId); // 很多框架如 Spring Data JPA、MyBatis查询不到数据时返回空集合而不是 null if (orderIds.isEmpty()) { System.out.println(该用户没有订单); } else { System.out.println(共有 orderIds.size() 个订单); }场景3结合你之前的 Feign 调用场景javaSetLong 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你项目已引入javaimport cn.hutool.core.collection.CollUtil; if (CollUtil.isNotEmpty(organizationIds)) { // 非 null 且非空 }自定义工具类javapublic 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)); }关键点null和empty是两种完全不同的状态null对象不存在调用任何方法都会抛 NPEempty对象存在但无元素isEmpty()返回true