首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 Lambda链式安全执行

Java 8 Lambda链式安全执行
EN

Stack Overflow用户
提问于 2018-12-31 19:31:13
回答 5查看 132关注 0票数 7

片段1:

代码语言:javascript
复制
Optional.of(s).map(str -> str).orElse("");

片段2:

代码语言:javascript
复制
Optional.of(s).map(str -> str).orElse(Optional.empty());

片段3:

代码语言:javascript
复制
Optional.of(s).map(str -> Optional.of(str)).orElse("hello");

Snippet 1编译良好,但Snippet 2 & Snippet 3编译时存在类型不兼容错误。虽然Snippet 2 & Snippet 3失败是件好事,但我不明白如何对它们进行评估。换句话说,我认为我缺少一些关于如何链接/调用lambdas本身的基本知识。如果有人能帮忙就好了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-12-31 19:33:24

片段1:

代码语言:javascript
复制
Optional.of(s).map(str -> str).orElse("");

编译是因为提供给orElse的默认值与Optional包含的值相同,即String

片段2:

代码语言:javascript
复制
Optional.of(s).map(str -> str).orElse(Optional.empty());

不编译,因为在map之后,您有一个Optional<String>,但是您在orElse中提供了一个Optional<String>,而它应该是一个String

片段3:

代码语言:javascript
复制
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时,可能就不需要了。

票数 11
EN

Stack Overflow用户

发布于 2018-12-31 19:38:43

分解片段2:

代码语言:javascript
复制
Optional.of(s)            //Optional<String>
        .map(str -> str)  //Optional<String>
        .orElse(Optional.empty()); //String or Optional<String>?

和片段3:

代码语言:javascript
复制
Optional.of(s)                        //Optional<String>
        .map(str -> Optional.of(str)) //Optional<Optional<String>>
        .orElse("hello");             //Optional<String> or String? 

现在,对于代码片段3,可以使用flatMap来消除嵌套选项:

代码语言:javascript
复制
Optional.of(s)                            //Optional<String>
        .flatMap(str -> Optional.of(str)) //Optional<String>
        .orElse("hello");                 //String
票数 3
EN

Stack Overflow用户

发布于 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(...),它将编译。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53990843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档