组合或其他抛出?

Combining orElseThrows?

我有以下代码,它按预期工作:

Optional.ofNullable(testItem.getId())
                .map(testItemRepository::get)
                .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID))
                .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID));

我想知道是否有办法只使用一个 orElseThrow-Part 或减少冗余?

只要方法 testItemRepositoryget 的调用导致 Optional.

,就使用 Optional#flatMap 方法展平 Optional 结构
 Optional.ofNullable(testItem.getId())
            .flatMap(testItemRepository::get)
            .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID));

即从 Optional<Optional<MyObject>>Optional<MyObect>.

好像是testItemRepository::getreturns另一个Optional<Something>。在那种情况下,您不应使用 map。使用 map 会给你一个嵌套的可选 - Optional<Optional<Something>>,正如你发现的那样,使用它并不好。 flatMap 正是为这种情况而设计的:

Optional.ofNullable(testItem.getId())
            .flatMap(testItemRepository::get)
            .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID));

flatMapOptional<A> 转换为 Optional<B>,给定 Function<A, Optional<B>>.