如果代码中有异常,我如何使用Optional返回空?

时间:2018-03-18 13:00:15

标签: java-8 optional

对Optional / Java8的使用很新,我对它的用法有疑问。 我的API中有一个函数,它返回一个可以为null或空的String。它类似于在电子邮件中找到id:abc@gmail.com - > abc是o / p。

现在,这样做的一种方法是:

public Optional<String> getUser(final String emailId) {

        if (TextUtils.isEmpty(emailId)) {
            return Optional.empty();
        }

        String userIDSeparator = "@";
        int userNameEndIndex = emailId.indexOf(userIDSeparator);

        if (userNameEndIndex == -1) {
            return Optional.empty();
        }

        return Optional.of(emailId.substring(0, userNameEndIndex));
}

我想知道是否有更简洁的方法来返回一个Optional?

另外,在Java8中引入了Optional,所以无论如何代码都可以兼容java7吗?我知道C中的预处理器不确定是否有类似的东西可用。

注意: 我没有编译此代码,因此可能存在一些错误。我想要输入Optional。

谢谢!

2 个答案:

答案 0 :(得分:4)

嗯,代码当然可以减少。即。

public Optional<String> getUser(final String emailId) {
       return Optional.of(emailId)
                      .filter(email -> email.contains("@"))
                      .map(email -> email.substring(0, email.indexOf("@")));
}

如果此方法可以获得null值,则您需要将Optional.of(emailId)更改为Optional.ofNullable(emailId)

至于:

  

此外,在Java8中引入了Optional,因此代码可以采用任何方式   是java7兼容吗?

不是我知道的。可能有其他库具有与Java的可选类型相似的功能,因此在线进行一些研究可能会使您到达正确的位置。

答案 1 :(得分:3)

也许你的意思是这样的:

public Optional<String> getUser(final String emailId) {
    return Optional.ofNullable(emailId)
            .filter(email -> email.contains("@"))
            .map(email -> Optional.of(email.replaceAll("(.*?)@.*", "$1")))
            .orElseGet(Optional::empty);
}

示例

null              ->   Optional.empty
""                ->   Optional.empty
"abc@gmail.com"   ->   abd

正如@Aominè提到的,我的解决方案中有一些不必要的部分,您可以使用此版本:

public Optional<String> getUser(final String emailId) {
    return Optional.ofNullable(emailId)
            .filter(email -> email.contains("@"))
            .map(email -> email.replaceAll("(.*?)@.*", "$1"));
}