这是另一个StackOverflow问题的代码段:
@Override
public String convertToDatabaseColumn(final UUID entityValue) {
return ofNullable(entityValue).map(entityUuid -> entityUuid.toString()).orElse(null);
}
我真的很难理解Optional类的用法。返回代码是“返回映射值(字符串)还是返回NULL(如果失败)?
return如何在方法而不是类上起作用-这是Optional.ofNullable()?
答案 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的文档。它准确地告诉您map
和orElse
的工作。
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。