我正在实现一个流,在其中使用集合 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));
答案 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页)