Java 8 потоков - преобразовать список UUID в список строк с учетом значения NULL - PullRequest
2 голосов
/ 26 апреля 2020
  • Я хочу установить List<String> для поля selectedResources.
  • getProtectionSet() возвращает List<ProtectionSet>
  • ProtectionSet имеет поле List<UUID> resourceIds, и это List<UUID> = List<String> Я хочу сохранить в selectedResources.
  • getProtectionSet() - это список, но я хочу получить значения из первого элемента
  • Я не хочу иметь исключение NPE
  • когда какой-либо список пуст, нет смысла дальше go.
private Mono<Protection> addProt(Protection protection) {
...
...
    MyClass.builder()
    .fieldA(...)
    .fieldB(...)
    .selectedResources(  //-->List<String> is expected
                       protection.getProtectionSet().stream() //List<ProtectionSet>
                                  .filter(Objects::nonNull)
                                  .findFirst()
                                  .map(ProtectionSet::getResourceIds) //List<UUID>
                                  .get()
                                  .map(UUID::toString)
                                  .orElse(null))
    .fieldD(...)

Как записать мой поток, чтобы избежать исключения NPE?

1 Ответ

4 голосов
/ 26 апреля 2020

Хотя вам не стоит сталкиваться с NullPointerException с вашим текущим кодом, все еще есть возможность получить NoSuchElementException для выполнения get на Optional без подтверждения присутствия.

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

protection.getProtectionSet().stream() //List<ProtectionSet>
        .filter(Objects::nonNull)
        .findFirst() // first 'ProtectionSet'
        .map(p -> p.getResourceIds()) // Optional<List<UUID>> from that 
        .orElse(Collections.emptyList()) // here if no such element is found
        .stream()
        .map(UUID::toString) // map in later stages
        .collect(Collectors.toList()) // collect to List<String>
...