Transforming an Empty String into an Empty Optional – 将空字符串转化为空的可选项

最后修改: 2019年 4月 5日

中文/混合/英文(键盘快捷键:t)

1. Introduction

1.绪论

In this quick tutorial, we’ll present different ways to transform a null or empty String into an empty Optional.

在这个快速教程中,我们将介绍不同的方法来将一个或空字符串转换为一个空a href=”/java-optional”>Optional

Getting an empty Optional out of null is straightforward — we just use Optional.ofNullable(). But, what if we want empty Strings to work this way as well?

null中得到一个空的Optional是很直接的 – 我们只需使用Optional.ofNullable()。但是,如果我们想让空的Strings也能这样工作呢?

So, let’s explore some different options for converting an empty String into an empty Optional.

因此,让我们探索一些不同的选项,将一个空的字符串转换成一个空的选项>。

2. Using Java 8

2.使用Java 8

In Java 8, we can leverage the fact that if an Optional#filter‘s predicate isn’t met, then it returns an empty Optional:

在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());
}

And we don’t even need to check for null here since ofNullable will short-circuit for us in cases where str is null.

而且我们甚至不需要在这里检查null,因为ofNullable会在str为null的情况下为我们提供短路。

Creating a special lambda for the predicate is a bit cumbersome, though. Can’t we get rid of it somehow?

为谓词创建一个特殊的lambda,虽然有点麻烦。我们不能以某种方式摆脱它吗?

3. Using Java 11

3.使用Java 11

The answer to the above wish doesn’t actually come until Java 11.

上述愿望的答案实际上要到Java 11才会出现。

In Java 11, we’ll still use Optional.filter(), but Java 11 introduces a new Predicate.not() API that makes it easy to negate method references.

在Java 11中,我们仍然会使用Optional.filter()但Java 11引入了一个新的Predicate.not() API,使其能够轻松否定方法引用。

So, let’s simplify what we did earlier, now using a method reference instead:

因此,让我们简化我们先前所做的,现在使用一个方法引用来代替。

@Test
public void givenEmptyString_whenFilteringOnOptionalInJava11_thenEmptyOptionalIsReturned() {
    String str = "";
    Optional<String> opt = Optional.ofNullable(str).filter(Predicate.not(String::isEmpty));
    Assert.assertFalse(opt.isPresent());
}

4. Using Guava

4.使用番石榴

We can also use Guava to satisfy our needs. However, in that case, we’ll use a slightly different approach.

我们也可以使用Guava来满足我们的需求。然而,在这种情况下,我们将使用一个稍微不同的方法。

Instead of calling a filter method on an outcome of Optional#ofNullable, we’ll first convert an empty String to null using Guava’s String#emptyToNull and only then pass it to Optional#ofNullable:

我们不会在Optional#ofNullable的结果上调用filter方法,而是首先使用Guava的String#emptyToNull将一个空的String转换为null,然后才将其传递给Optional#ofNullable

@Test
public void givenEmptyString_whenPassingResultOfEmptyToNullToOfNullable_thenEmptyOptionalIsReturned() {
    String str = "";
    Optional<String> opt = Optional.ofNullable(Strings.emptyToNull(str));
    Assert.assertFalse(opt.isPresent());
}

5. Conclusion

5.总结

In this short article, we’ve explored different ways to transform an empty String to an empty Optional.

在这篇短文中,我们探讨了将一个空的字符串转换为一个空的选项>的不同方法。

As usual, the examples used in this article can be found in our GitHub project.

像往常一样,本文中使用的例子可以在我们的GitHub项目中找到。