组合或其他抛出?
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::get
returns另一个Optional<Something>
。在那种情况下,您不应使用 map
。使用 map
会给你一个嵌套的可选 - Optional<Optional<Something>>
,正如你发现的那样,使用它并不好。 flatMap
正是为这种情况而设计的:
Optional.ofNullable(testItem.getId())
.flatMap(testItemRepository::get)
.orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID));
flatMap
将 Optional<A>
转换为 Optional<B>
,给定 Function<A, Optional<B>>
.
我有以下代码,它按预期工作:
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::get
returns另一个Optional<Something>
。在那种情况下,您不应使用 map
。使用 map
会给你一个嵌套的可选 - Optional<Optional<Something>>
,正如你发现的那样,使用它并不好。 flatMap
正是为这种情况而设计的:
Optional.ofNullable(testItem.getId())
.flatMap(testItemRepository::get)
.orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID));
flatMap
将 Optional<A>
转换为 Optional<B>
,给定 Function<A, Optional<B>>
.