
Java 中没有内置的 isContained() 方法,但可通过 Optional 和 String.contains() 组合实现 null 安全的子串反向检查,避免显式判空和 NullPointerException。
java 中没有内置的 `iscontained()` 方法,但可通过 `optional` 和 `string.contains()` 组合实现 null 安全的子串反向检查,避免显式判空和 nullpointerexception。
在日常开发中,我们常需判断某个动态字符串(如方法返回值)是否作为子串出现在一个已知常量或固定字符串中。例如:
final String testStr = anyMethod(); // 可能为 null
if (testStr.contains(AnyClass.STRING_CONSTANT)) { ... } // ❌ 风险:testStr 为 null 时抛出 NPE
直接调用 testStr.contains(...) 存在明显风险——当 testStr 为 null 时会触发 NullPointerException。虽然可先判空(testStr != null && testStr.contains(...)),但代码冗余且可读性下降。
更优雅的解法是反转检查方向:将 null 风险转移到被搜索的目标字符串上,并利用 Optional 实现声明式、安全的逻辑封装。推荐以下两种方式:
✅ 推荐方案一:Optional.ofNullable().map().orElse()
boolean contained = Optional.ofNullable(fullString)
.map(s -> s.contains(testStr))
.orElse(false);
- 当
fullString == null→map()不执行,直接返回false; - 当
fullString != null→ 安全调用contains(),结果布尔值原样返回; - 语义清晰、零副作用、完全 null-safe,且明确表达“若主串为空,则视为不包含”。
✅ 推荐方案二(慎用):Optional.ofNullable().orElse("").contains()
boolean contained = Optional.ofNullable(fullString)
.orElse("")
.contains(testStr);
- 虽简洁,但存在边界陷阱:当
testStr为空字符串""时,"".contains("")返回true,可能违背业务预期; - 更严重的是,若
fullString为null,该写法会误将空串视作有效上下文,掩盖数据缺失问题。
⚠️ 注意事项:
String.contains(CharSequence)要求参数非null,因此testStr仍需确保非空(如题干所述“guaranteed ≠ null”,否则需额外防护);- 若
testStr也可能为null,应统一前置校验或使用Objects.nonNull(testStr) && Optional.ofNullable(fullString).map(...).orElse(false);- 该模式适用于 JDK 8+;若受限于旧版本,可用三元运算符替代:
(fullString != null ? fullString.contains(testStr) : false)。
综上,以 Optional.map().orElse() 为核心的反向检查,是兼顾安全性、可读性与函数式风格的最佳实践,既规避了冗余判空,又杜绝了 NPE,值得在工具类或通用校验逻辑中复用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











