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 上找到。


原始标题:Transforming Empty Strings into Empty Optionals