Nano Hash - криптовалюты, майнинг, программирование

Должен ли я предпочесть метод ifPresent методу isPresent?

У меня есть этот код, использующий последний:

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 перед вызовом функционального метода? Если да, то как? Как вернуть объект типа, отличного от типа функционального метода?

Я на Яве 12.

04.05.2019


Ответы:


1

Используйте метод 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. Вы можете просто сразу проверить значение null.

String subject = claims.get().getSubject();
if (subject == null) {
    throw new BadCredentialsException(
        "The authentication token " + optToken + " did not contain a subject.");
}

UsernamePasswordAuthenticationToken authentication = ... ;
04.05.2019

2

В этом случае вы можете использовать orElseThrow, который генерирует исключение, если значение отсутствует:

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

3

Если вы действительно хотите использовать ifPresent, вы можете сделать что-то вроде

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

но так как вы кидаете на пропущенную тему почему бы просто не сделать

String subject = Optional.ofNullable(claims.get().getSubject())
        .orElseThrow(() -> new BadCredentialsException(...));
UserDetails userDetails = loadUserByUsername(subject);
...
04.05.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..