如何解释和使用Java 1.8可选类

时间:2018-06-25 06:44:17

标签: java

这是另一个StackOverflow问题的代码段:

@Override
public String convertToDatabaseColumn(final UUID entityValue) {
    return ofNullable(entityValue).map(entityUuid -> entityUuid.toString()).orElse(null);
}

我真的很难理解Optional类的用法。返回代码是“返回映射值(字符串)还是返回NULL(如果失败)?

return如何在方法而不是类上起作用-这是Optional.ofNullable()?

5 个答案:

答案 0 :(得分:8)

这是对Optional的非常不好的使用。实际上是java developers themself say that optional should not be used in such cases,但仅作为方法的返回参数。更多详细信息,请参见:Is it good practice to use optional as an attribute in a class

代码可以重写为此:

@Override
public String convertToDatabaseColumn(final UUID entityValue) {
    return entityValue == null ? null : entityValue.toString();
}

答案 1 :(得分:3)

  

返回代码是“返回映射值(字符串)还是失败则返回NULL?”

是的。您可以查看Optional here的文档。它准确地告诉您maporElse的工作。

  

return如何在方法而不是类上起作用-这是Optional.ofNullable()?

您没有返回该方法。您正在返回方法的返回值。看这个简单的例子:

int myMethod() {
    return foo();
}

int foo() { return 10; }

看到了吗?我没有返回foo方法,而是返回了10的返回值foo

请注意,可以通过函数接口返回方法。

在这种情况下,您将返回方法链orElse中最后一个方法的返回值。 ofNullable创建一个Optional<T>,然后在此对象上调用map并返回一个新的Optional<T>,然后调用orElse返回值被返回。

答案 2 :(得分:2)

让我们一步一步来

ofNullable(entityValue)

创建传入参数的可选参数(使用of()可以将NPE抛出为空输入,该参数可以为空)

.map(entityUuid -> entityUuid.toString())

然后,您选择实际值,并对该值调用toString() ...仅在entityValue不为null时才会发生。如果为null,则结果来自orElse(null)

最后,作为方法的结果返回在Optional上进行该操作的结果。

上面的代码不过是

的美化版本
if (entityValue == null) return null;
return entityValue.toString();

可选参数在Java中有其地位,但是您的示例不是一个好例子。

这一点也不有助于提高可读性,并且您并不孤单地想知道“这里发生了什么”。

答案 3 :(得分:1)

代码可以像这样:

public String convertToDatabaseColumn(final UUID entityValue) {
    if(entityValue==null){
        return null;
    }else{
        return entityValue.toString();
    }
}

您的初始代码包含两个语句: Optional.ofNullable(entityValue):创建一个Optional Object来说明该值可以存在或不存在。 .map(entityUuid-> entityUuid.toString())。orElse(null);您可以对Optional对象应用一些操作,返回它的字符串或null。

这将以更优雅的方式避免空指针异常。

答案 4 :(得分:0)

可选。ofNullable(T值):

如果描述的值不为null,则返回描述指定值的Optional,否则返回空的Optional。

可选。或其他(空)

返回该值(如果存在),否则返回null。

关注this link