Java 我应该更喜欢'ifPresent'方法而不是'isPresent'方法吗?
我使用后者编写了以下代码:Java 我应该更喜欢'ifPresent'方法而不是'isPresent'方法吗?,java,optional,Java,Optional,我使用后者编写了以下代码: Optional<String> subject = Optional.ofNullable(claims.get().getSubject()); if (subject.isPresent()) { UserDetails userDetails = userDetailsService.loadUserByUsername(subject.get()); UsernamePasswordAuthenticationToken authenti
Optional<String> subject = Optional.ofNullable(claims.get().getSubject());
if (subject.isPresent()) {
UserDetails userDetails = userDetailsService.loadUserByUsername(subject.get());
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails,
null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
logger.debug("Security - The request authenticated fine from the JWT Access token");
return authentication;
} else {
throw new BadCredentialsException("The authentication token " + optToken + " did not contain a subject.");
}
Optional subject=Optional.ofNullable(claims.get().getSubject());
if(subject.isPresent()){
UserDetails UserDetails=userDetailsService.loadUserByUsername(subject.get());
UsernamePasswordAuthenticationToken authentication=新的UsernamePasswordAuthenticationToken(userDetails,
null,userDetails.getAuthorities());
authentication.setDetails(新的WebAuthenticationDetailsSource().buildDetails(请求));
debug(“安全性-来自JWT访问令牌的经过身份验证的请求”);
返回认证;
}否则{
抛出新的BadCredentialsException(“身份验证令牌“+optoken+”不包含主题”);
}
我正在尝试使用ifPresent
方法重构它
在函数方法调用之前,是否应该先调用userDetailsService.loadUserByUsername
服务调用?如果是,如何解决?如何返回不同于函数方法类型的对象
我使用的是Java 12。在本例中,您可以使用
orelsetrow
,如果值不存在,则会引发异常:
String subjectValue = subject.orElseThrow(() ->
new BadCredentialsException("The authentication token " + optToken + " did not contain a subject."));
...
使用
map
方法转换可选值的值。
转换后,您可以使用orelsetrow
方法解包可选
,如果异常为空,则抛出异常
大概是这样的:
return Optional.ofNullable(claims.get().getSubject())
.map(userDetailsService::loadUserByUsername)
.map(userDetails -> {
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
authentication.setDetails(
new WebAuthenticationDetailsSource().buildDetails(request));
return authentication;
})
.orElseThrow(() -> new BadCredentialsException(
"The authentication token " + optToken + " did not contain a subject."));
但是,在您的特定情况下,完全不使用Optional
可能更简单。您可以立即检查null
String subject = claims.get().getSubject();
if (subject == null) {
throw new BadCredentialsException(
"The authentication token " + optToken + " did not contain a subject.");
}
UsernamePasswordAuthenticationToken authentication = ... ;
如果您真的想使用ifPresent
,可以执行以下操作
subject.ifPresent(s -> {
UserDetails userDetails = loadUserByUsername(s);
...
});
但是既然你在谈论一个遗漏的话题,为什么不干脆去做呢
String subject = Optional.ofNullable(claims.get().getSubject())
.orElseThrow(() -> new BadCredentialsException(...));
UserDetails userDetails = loadUserByUsername(subject);
...
我想你的问题已经在这里得到了回答。