Java 8 Lambda Chaining - 类型安全执行

Kar*_*ick 7 java optional java-8

小片1:

Optional.of(s).map(str -> str).orElse("");
Run Code Online (Sandbox Code Playgroud)

摘录2:

Optional.of(s).map(str -> str).orElse(Optional.empty());
Run Code Online (Sandbox Code Playgroud)

代码段3:

Optional.of(s).map(str -> Optional.of(str)).orElse("hello");
Run Code Online (Sandbox Code Playgroud)

Snippet 1正在编制罚款,但Snippet 2Snippet 3同类型不兼容的错误编译.虽然这是很好的,Snippet 2Snippet 3失败,我不明白他们是如何评价.换句话说,我认为我在lambdas本身被链接/调用方面缺少一些基础知识.如果有人能提供帮助,我将不胜

Ous*_* D. 11

小片1:

Optional.of(s).map(str -> str).orElse("");
Run Code Online (Sandbox Code Playgroud)

编译因为提供的默认值与包含的值相同,即a .orElse OptionalString

摘录2:

Optional.of(s).map(str -> str).orElse(Optional.empty());
Run Code Online (Sandbox Code Playgroud)

不编译,因为map你有一个Optional<String>但后来你提供了一个Optional<String>,orElse而它应该是一个String.

代码段3:

Optional.of(s).map(str -> Optional.of(str)).orElse("hello");
Run Code Online (Sandbox Code Playgroud)

不编译,因为map你有一个,Optional<Optional<String>>但你传递的String,orElse而它应该是一个Optional<String>.

总结orElse被宣告为:

公共T orElse(T其他)

并记录为:

返回值(如果存在),否则返回其他值.

orElse基本上说"给我可选包含的值,否则采用默认值"以及T必须与Optional包含的值相同的类型.

所以,如果你有Optional<String,那么你必须提供一个StringorElse,如果你有Optional<Integer,那么你必须提供一个IntegerorElse等...


另外,map第一个和第二个示例代码段中的函数是多余的,因此您可以完全省略它.

每当你看到你的自我调用Optional#map函数,因为v -> v它可能不需要.

  • 值得注意的是,由于map调用位于链的中间,因此类型推断仅考虑左侧,否则,我们可以推断不同的函数类型以使其起作用。例如,您可以通过将`.map(…)`替换为`。&lt;Object&gt; map(…)`来使所有示例正常工作。 (2认同)