具有空集合的Java可选orElseThrow

时间:2019-05-09 13:29:00

标签: java exception java-8 java-stream optional

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

我要确保此方法在栏列表上没有项目的情况下会抛出 ResourceNotFoundException ,尽管在​​当前状态下它会检查列表栏是否为null,否则检查列表栏是否为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));

3 个答案:

答案 0 :(得分:5)

我真的看不到使用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);
}

答案 1 :(得分:2)

然后为其添加一个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取代。

答案 2 :(得分:0)

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

  

容器类型,包括集合,地图,流,数组和   可选选项不应包含在可选选项中。 (第252页)