带有空集合的Java可选OrelsThrow

带有空集合的Java可选OrelsThrow,java,exception,java-8,java-stream,optional,Java,Exception,Java 8,Java Stream,Optional,我正在实现一个流,在这个流中,我使用一个集合listOfFoo来获取该列表中所有项目的ID,并使用它们来获取Bar实例的值 我想确保,如果bars列表中没有项目,该方法将抛出ResourceNotFoundException,尽管在当前状态下,它会检查列表栏是否为空,因为它包含一个空列表 你能帮我提出一些解决办法吗 List<Bar> bars = Optional.ofNullable( listOfFoos.stream() .map(

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

我想确保,如果bars列表中没有项目,该方法将抛出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));
列表栏=可选。不可用(
listofoos.stream()
.map(Foo::getId)
.map(fooId->service.getbar(fooId))
.filter(对象::非空)
.collect(收集器.toList())
.orelsetrow(()->new ResourceNotFoundException(Bar.class,OBJECT_NULL));

只需添加一个可选的
。然后对其进行筛选。你可以这样做:

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));
列表栏=可选。不可用(
listofoos.stream().map(fooId->service.getbar(fooId))
.filter(Objects::nonNull).collect(collector.toList())
.filter(a->!a.isEmpty())
.orelsetrow(()->new ResourceNotFoundException(Bar.class,OBJECT_NULL));

旁白:通过代码中共享的实现,流返回的列表不能是
null
,因此
可选。不可用的
可能会被
可选替换。对于

我真的看不到使用
可选的好处,没有它会更可读:

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

if (bars.isEmpty()) {
   throw new ResourceNotFoundException(Bar.class, OBJECT_NULL);
}
List bar=listofoos.stream()
.map(Foo::getId)
.map(服务::getBars)
.collect(Collectors.toList());
if(bar.isEmpty()){
抛出新的ResourceNotFoundException(Bar.class,OBJECT_NULL);
}

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

容器类型,包括集合、映射、流、数组和 期权不应包装在期权中。(临252)