英文:
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<TpUser> selectedTpUser = tpUserRepo.findById(tpUserId);
return selectedTpUser.map(user -> user.getFirstName() + " " + user.getSurName())
.orElseThrow(() -> new IllegalArgumentException("No user found for this id"));
}
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<User>
映射为Optional<String>
。 - 第二步(
orElseThrow(...)
)解包Optional<String>
,从而返回一个String
(如果为空则抛出IllegalArgumentException
)。
我们可以在这里找到 Optional::map
的源代码。
英文:
The whole chain of operations returns a String
:
- The first step (
map(...)
) maps theOptional<User>
to anOptional<String>
. - The second step (
orElseThrow(...)
) unwraps theOptional<String>
, thus returning aString
(or throwing anIllegalArgumentException
, 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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论