具有空集合的Java可选orElseThrow

gar*_*ble 2 java exception optional java-8 java-stream

我正在实现一个流,在其中使用集合listOfFoo来获取该列表中所有项目的ID,并使用它们来获取Bar实例的值。

我想确保此方法在酒吧列表上没有任何项目的情况下将抛出ResourceNotFoundException,尽管在当前状态下它会检查列表酒吧是否为null,而不是,因为它包含一个空列表。

您能帮我一下,并提出一些解决方案吗?

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));
Run Code Online (Sandbox Code Playgroud)

log*_*sex 7

《Effective Java》一书中提到了以下内容:

容器类型(包括集合、映射、流、数组和可选值)不应包装在可选值中。(第252页)


Oli*_*ssé 6

I don't really see the benefit of using Optional, it would be more readable without it :

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

if (bars.isEmpty()) {
   throw new ResourceNotFoundException(Bar.class, OBJECT_NULL);
}
Run Code Online (Sandbox Code Playgroud)


Nam*_*man 5

只需添加一个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));
Run Code Online (Sandbox Code Playgroud)

旁白:通过代码中共享的实现,流返回的列表不可能是null,因此Optional.ofNullable可能会被替换为Optional.of