片段1:
Optional.of(s).map(str -> str).orElse("");片段2:
Optional.of(s).map(str -> str).orElse(Optional.empty());片段3:
Optional.of(s).map(str -> Optional.of(str)).orElse("hello");Snippet 1编译良好,但Snippet 2 & Snippet 3编译时存在类型不兼容错误。虽然Snippet 2 & Snippet 3失败是件好事,但我不明白如何对它们进行评估。换句话说,我认为我缺少一些关于如何链接/调用lambdas本身的基本知识。如果有人能帮忙就好了。
发布于 2018-12-31 19:33:24
片段1:
Optional.of(s).map(str -> str).orElse("");编译是因为提供给orElse的默认值与Optional包含的值相同,即String。
片段2:
Optional.of(s).map(str -> str).orElse(Optional.empty());不编译,因为在map之后,您有一个Optional<String>,但是您在orElse中提供了一个Optional<String>,而它应该是一个String。
片段3:
Optional.of(s).map(str -> Optional.of(str)).orElse("hello");不编译,因为在map之后您有一个Optional<Optional<String>>,但是您在orElse中传递一个String,而它应该是一个Optional<String>。
最后,orElse声明为:
公共T orElse(T其他)
并记录为:
如果存在,则返回值,否则返回other。
也就是说,orElse基本上是说“给我可选包含的值,如果不存在,则取默认值”,并且T必须是与Optional包含的值相同的类型。
因此,如果您有一个Optional<String,那么您必须向orElse提供一个String,如果您有一个Optional<Integer,那么您必须向orElse等提供一个Integer。
另外,第一个和第二个示例片段中的map函数是多余的,因此可以完全省略它。
每当您看到自己用函数作为Optional#map调用v -> v时,可能就不需要了。
发布于 2018-12-31 19:38:43
分解片段2:
Optional.of(s) //Optional<String>
.map(str -> str) //Optional<String>
.orElse(Optional.empty()); //String or Optional<String>?和片段3:
Optional.of(s) //Optional<String>
.map(str -> Optional.of(str)) //Optional<Optional<String>>
.orElse("hello"); //Optional<String> or String? 现在,对于代码片段3,可以使用flatMap来消除嵌套选项:
Optional.of(s) //Optional<String>
.flatMap(str -> Optional.of(str)) //Optional<String>
.orElse("hello"); //String发布于 2018-12-31 19:39:17
.orElse()尝试重新打包Optional,如果没有找到,则提供一个默认值,因此传递给.orElse()的对象需要与当前可选的内容兼容。
换句话说,如果您有一个Optional<T>,则需要将T传递给orElse()方法。
在本例中,您从Optional<String开始,然后从它派生Optional<Optional<String>>:
Optional.of(s) .map(str -> Optional.of(str)) .orElse("hello");
如果将str -> str传递给map(...),它将编译。
https://stackoverflow.com/questions/53990843
复制相似问题