1. 引言
在本篇简短教程中,我们会介绍几种 将 null 或空字符串转换为空的 Optional
的方式。
从 null 转换为空的 Optional
是很直接的 —— 我们只需要使用 Optional.ofNullable()
。但如果我们希望空字符串也以同样的方式处理呢?
接下来,我们一起来看看如何优雅地将空字符串也转换为空的 Optional
。
2. 使用 Java 8
在 Java 8 中,我们可以利用 Optional#filter
的特性:如果其判断条件不满足,会返回一个空的 Optional
。
示例如下:
@Test
public void givenEmptyString_whenFilteringOnOptional_thenEmptyOptionalIsReturned() {
String str = "";
Optional<String> opt = Optional.ofNullable(str).filter(s -> !s.isEmpty());
Assert.assertFalse(opt.isPresent());
}
这里我们不需要手动判断 str
是否为 null,因为 Optional.ofNullable()
已经帮我们处理好了。
不过,写一个 lambda 表达式作为判断条件,略显啰嗦。能不能更简洁一点?我们继续往下看。
3. 使用 Java 11
这个问题的更优雅解法,要等到 Java 11 才出现。
Java 11 引入了 Predicate.not()
方法,可以让我们更简洁地使用方法引用作为判断条件。
我们来重写上面的例子:
@Test
public void givenEmptyString_whenFilteringOnOptionalInJava11_thenEmptyOptionalIsReturned() {
String str = "";
Optional<String> opt = Optional.ofNullable(str).filter(Predicate.not(String::isEmpty));
Assert.assertFalse(opt.isPresent());
}
✅ 这样写不仅语义清晰,而且代码简洁,推荐在 Java 11 及以上版本中使用。
4. 使用 Guava
如果你的项目中引入了 Guava,也可以使用它来实现。
Guava 提供了 Strings.emptyToNull()
方法,可以将空字符串转换为 null。我们再结合 Optional.ofNullable()
即可:
@Test
public void givenEmptyString_whenPassingResultOfEmptyToNullToOfNullable_thenEmptyOptionalIsReturned() {
String str = "";
Optional<String> opt = Optional.ofNullable(Strings.emptyToNull(str));
Assert.assertFalse(opt.isPresent());
}
✅ 这种方式逻辑清晰,适合已经引入 Guava 的项目。
❌ 缺点是:如果你只是为了这个小功能引入 Guava,那就有点“杀鸡用牛刀”了。
5. 总结
我们在这篇简短文章中介绍了三种将空字符串转换为空 Optional
的方式:
方法 | Java 版本 | 是否推荐 | 说明 |
---|---|---|---|
filter(s -> !s.isEmpty()) |
Java 8+ | ✅ | 简单有效,但写法略显啰嗦 |
filter(Predicate.not(String::isEmpty)) |
Java 11+ | ✅✅✅ | 推荐首选,简洁清晰 |
Strings.emptyToNull() + ofNullable() |
Java 8+ (需 Guava) | ⚠️ | 适合已有 Guava 的项目 |
如无特别限制,建议使用 Java 11 的 Predicate.not()
方式,简洁又现代。
完整示例代码可在 GitHub 上找到。