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