Java 带有空集合的可选 orElseThrow

Java Optional orElseThrow with empty collection

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

我想确保此方法将抛出 ResourceNotFoundException 以防 bars 列表中没有项目,尽管在当前状态下它会检查 list bars 是否为 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));

那就加一个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替换。

我没有真正看到使用 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);
}

本书有效Java提到了以下内容:

Container types, including collections, maps, streams, arrays, and optionals should not be wrapped in optionals. (P.252)