我应该更喜欢ifPresent方法而不是isPresent方法吗?

时间:2019-05-04 15:17:23

标签: java optional

我使用的是后者的代码:

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.");
}

我正在尝试使用ifPresent方法来重构它。

在函数方法调用之前,我应该进行userDetailsService.loadUserByUsername服务调用吗?如果是这样,怎么办?如何返回类型不同于功能方法类型的对象?

我正在使用Java 12。

3 个答案:

答案 0 :(得分:3)

使用)方法来转换map的值。 转换之后,可以使用Optional方法解压缩orElseThrow的包装,如果为空则抛出异常。

类似这样的东西:

Optional

但是,在您的特定情况下,根本不使用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

答案 1 :(得分:2)

在这种情况下,您可以使用orElseThrow,如果不存在该值,则会抛出异常:

String subjectValue = subject.orElseThrow(() ->
    new BadCredentialsException("The authentication token " + optToken + " did not contain a subject."));
...

答案 2 :(得分:0)

如果您真的想使用ifPresent,可以做类似的事情

subject.ifPresent(s -> {
     UserDetails userDetails = loadUserByUsername(s);
     ...
});

但是既然您丢了一个丢失的主题,为什么不干脆

String subject = Optional.ofNullable(claims.get().getSubject())
        .orElseThrow(() -> new BadCredentialsException(...));
UserDetails userDetails = loadUserByUsername(subject);
...