Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该更喜欢'ifPresent'方法而不是'isPresent'方法吗?_Java_Optional - Fatal编程技术网

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);
...
我想你的问题已经在这里得到了回答。