理解 Optional<T>.map()

5

下面是一个使用Optional的示例,其中optional首先通过数据库调用进行加载,然后映射到Spring安全性UserDetails实例。代码如下:

Optional<User> user = userRepository.findByName(username);
user.orElseThrow(()-> new UsernameNotFoundException("Ahhh Shuckkkks!!!");
return user.map(CustomUserDetails::new).get();

在最后一行,该调用是否等于 return new CustomUserDetails(user.get())
此外,有人知道是否有更短、更流畅的方法来编写上述示例吗?

4
返回一个由 userRepository.findByName(username) 获取的用户对象,如果找不到该用户则抛出 UsernameNotFoundException 异常并返回 "Ahhh Shuckkkks!!!"。最终将该用户对象传递给 CustomUserDetails 的构造函数来创建一个新的 CustomUserDetails 对象。 - Alexis C.
1个回答

11

是的,那样会相当于。但是代码应该写成如下形式:

return userRepository.findByName(username)
    .map(CustomUserDetails::new)
    .orElseThrow(()-> new UsernameNotFoundException("Ahhh Shuckkkks!!!"));

这样可以避免无用的变量,将例外情况隔离在结尾,并避免了对get()方法的恶意调用,因为在此之前你已经调用了orElseThrow()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接