Java Необязательный orElseThrow с пустой коллекцией - PullRequest
1 голос
/ 09 мая 2019

Я реализую поток, в котором я использую коллекцию listOfFoo , чтобы получить идентификаторы всех элементов в этом списке и использовать их для получения значений экземпляров Bar.

Я хотел бы убедиться, что этот метод будет выдавать ResourceNotFoundException в случае отсутствия элементов в списке баров, хотя в текущем состоянии он проверяет, является ли строка баров нулевой, и это не так,так как он содержит пустой список.

Не могли бы вы мне помочь и предложить какое-нибудь решение?

List<Bar> bars = Optional.ofNullable(listOfFoos.stream().map(Foo::getId)                                         
       .map(fooId -> service.getBars(fooId))                                            
       .filter(Objects::nonNull).collect(Collectors.toList()))                            
   .orElseThrow(() -> new ResourceNotFoundException(Bar.class, OBJECT_NULL));

Ответы [ 2 ]

5 голосов
/ 09 мая 2019

Я не вижу преимущества использования Optional, без него было бы удобнее читать:

List<Bar> bars = listOfFoos.stream()
   .map(Foo::getId)       
   .map(service::getBars)                    
   .collect(Collectors.toList());

if (bars.isEmpty()) {
   throw new ResourceNotFoundException(Bar.class, OBJECT_NULL);
}
2 голосов
/ 09 мая 2019

Просто добавьте Optional.filter для него.Вы можете сделать это следующим образом:

List<Bar> bars = Optional.ofNullable(
        listOfFoos.stream().map(fooId -> service.getBars(fooId))
                .filter(Objects::nonNull).collect(Collectors.toList()))
        .filter(a -> !a.isEmpty())
        .orElseThrow(() -> new ResourceNotFoundException(Bar.class, OBJECT_NULL));

В сторону: из-за реализации, представленной в коде, список, возвращаемый потоком, не может быть null, поэтому Optional.ofNullable может быть заменен на Optional.of.

...