了解Optional <t> .map()

时间:2017-11-29 16:08:57

标签: java java-8 spring-data-jpa

查看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())

也有人知道如果有更短流畅的方式来编写上面的例子吗?

1 个答案:

答案 0 :(得分:10)

是的,那是相同的。但代码应该写成

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

这避免了一个无用的变量,在最后隔离了特殊情况,并避免了对get()的恶意调用,这只能保证在这里工作正常,因为你之前调用了orElseThrow()。 p>