Optional.map()的工作原理是怎样的?

huangapple go评论76阅读模式
英文:

How does Optional.map() exactly works?

问题

根据javadoc,Optional.map()方法返回一个Optional。

在以下代码片段中:

public String getName(Long tpUserId) {
    Optional<TpUser> selectedTpUser = tpUserRepo.findById(tpUserId);
    return selectedTpUser.map(user -> user.getFirstName() + " " + user.getSurName())
        .orElseThrow(() -> new IllegalArgumentException("No user found for this id"));
}

看起来,我想返回一个String,但实际上我得到的是一个Optional。尽管如此,却没有编译错误。为什么呢?

英文:

According to javadoc, Optional.map() returns an Optional.

In the following snippet:

public String getName(Long tpUserId) {
    Optional&lt;TpUser&gt; selectedTpUser = tpUserRepo.findById(tpUserId);
    return selectedTpUser.map(user -&gt; user.getFirstName() + &quot; &quot; + user.getSurName())
        .orElseThrow(() -&gt; new IllegalArgumentException(&quot;No user found for this id&quot;));
  }

it looks like, I want to return a String but I get an Optional<String>. Nevertheless there is no compile error. Why?

答案1

得分: 5

整个操作链返回一个 String

  • 第一步(map(...))将 Optional&lt;User&gt; 映射为 Optional&lt;String&gt;
  • 第二步(orElseThrow(...))解包 Optional&lt;String&gt;,从而返回一个 String(如果为空则抛出 IllegalArgumentException)。

我们可以在这里找到 Optional::map 的源代码。

英文:

The whole chain of operations returns a String:

  • The first step (map(...)) maps the Optional&lt;User&gt; to an Optional&lt;String&gt;.
  • The second step (orElseThrow(...)) unwraps the Optional&lt;String&gt;, thus returning a String (or throwing an IllegalArgumentException, if empty).

We can find the source code of Optional::map here.

答案2

得分: 3

你说得完全正确。map() 方法返回一个 Optional,我赞赏你使用了 javadoc。不同之处在于,然后你在 map() 返回的 Optional 上调用了 orElseThrow() 方法。如果你参考 javadoc 中对 orElseThrow() 的描述,你会看到它返回 "the present value [of the Optional]"。在这种情况下,它是一个字符串。

英文:

You are totally correct. The map() method returns an Optional, and I applaud your use of the javadoc. The difference here is that you then invoke the orElseThrow() method on that Optional that map() returned. If you refer to the javadoc for orElseThrow(), you will see that it returns "the present value [of the Optional]". In this case, that is a String.

huangapple
  • 本文由 发表于 2020年9月17日 23:21:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/63941255.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定