对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。
谢谢!
答案 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"));
}