Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有任何可靠的建议来源支持或反对使用Optional作为对象转换机制_Java_Optional - Fatal编程技术网

Java 是否有任何可靠的建议来源支持或反对使用Optional作为对象转换机制

Java 是否有任何可靠的建议来源支持或反对使用Optional作为对象转换机制,java,optional,Java,Optional,免责声明-我不想讨论这种在Java中使用可选类的方式,而是想指出支持或反对它的著名信息 我最近发现,使用Java中的可选类(或JavaSlang中的Option类)是通过一系列步骤来表示对象转换的一种简便方法,例如: Optional.of(objectA) .map(ServiceObject::someObjectFromA) .map(AnotherService::someObjectFromB) .flatMap(ObjectB::somePropertyOnB) .map(YetAn

免责声明-我不想讨论这种在Java中使用可选类的方式,而是想指出支持或反对它的著名信息

我最近发现,使用Java中的可选类(或JavaSlang中的Option类)是通过一系列步骤来表示对象转换的一种简便方法,例如:

Optional.of(objectA)
.map(ServiceObject::someObjectFromA)
.map(AnotherService::someObjectFromB)
.flatMap(ObjectB::somePropertyOnB)
.map(YetAnotherService::someObjectC)
.getOrElseThrow(new Exception("Could not convert object A to object C"));
这个想法最好用返回语句来表达:

Optional<ObjectC> fromObjectA(ObjectA objectA) {
    return Optional.ofNullable(objectA)
    .map(ServiceObject::someObjectFromA)
    .map(AnotherService::someObjectFromB)
    .flatMap(ObjectB::somePropertyOnB)
    .map(YetAnotherService::someObjectC);
}
可选fromObjectA(ObjectA ObjectA){
返回可选的.ofNullable(objectA)
.map(ServiceObject::someObjectFromA)
.map(另一个服务::someObjectFromB)
.flatMap(ObjectB::somePropertyOnB)
.map(YetAnotherService::someObjectC);
}
这种方法对我的好处是,它清楚地显示了如何将初始objectA转换为我实际想要的对象,并且所有中间对象都具有尽可能小的作用域。我还获得了不必担心空值的好处,并且可以很自然地响应返回可选值的方法

问题是,我找不到任何信誉良好的信息来源可以清楚地证明这是一种有效或无效的方法

Stuart Marks在中制定的规则并没有真正说明这种用法。虽然只使用getter而不是外部服务调用,但是有一个示例演示了这种方法

尽管您可能正在使用决定使用运行时异常(即JPA)的库,但也存在处理选中异常的问题

但是,它确实违反了Optional的目的,即仅表示值的存在或不存在

但是,JavaSlang选项中的peek()等方法倾向于强调它是一个可以通过这种方式进行交互的容器

它还很好地删除了大约4个null或.isPresent()检查

但为了它的聪明,它可能是功能性呕吐物/方法链接。这就是我的困境


因此,如果不把这变成关于如何使用可选类的又一个无休止的讨论,有谁能告诉我关于使用可选类的演讲、博客文章或文档吗?

可选类是一个单子,是函数式编程的基石

您会问,链接一元变换是否是一种成熟的模式

当然是

在函数式编程中有很多关于单子的资料,例如or,或者and背后的整个哲学

在函数式编程中寻找monad会得到很多结果,我不会只局限于Java可选的搜索


一个很好的来源可能是课程中的视频讲座1.4单子。

如果我能用它来解决我的问题,那么它是100%有信誉的。嗯?其目的是“表示存在或不存在值”。@EJP我想OP是说他只想将
Optional
用作转换机制,而不是表示存在或不存在值。我以前没有见过这种用法,但如果您愿意,我可以将其添加到我的规则列表中。:-)@斯图尔特马克:那太好了。尽管这算是滥用可选用例还是有效用例?