Java 合并Orelse投掷?

Java 合并Orelse投掷?,java,optional,Java,Optional,我有以下代码,它可以按预期工作: Optional.ofNullable(testItem.getId()) .map(testItemRepository::get) .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID)) .orElseThrow(() -> new TestException(ReturnCode.UN

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

Optional.ofNullable(testItem.getId())
                .map(testItemRepository::get)
                .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID))
                .orElseThrow(() -> new TestException(ReturnCode.UNKNOWN_ID));
我想知道是否有一种方法可以只使用一个或多个部分,还是减少冗余?

使用
Optional#flatMap
方法,只要调用方法
testItemRepositoryget
导致
Optional
就可以展平可选结构

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

也就是说,从
Optional
Optional
testItemRepository::get
返回另一个
Optional
。在这种情况下,不应使用
map
。使用
map
将得到一个嵌套的可选-
optional
,正如您所发现的,使用它并不好<代码>平面图正是针对这种情况而设计的:

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

flatMap
Optional
转换为
Optional
,给定
函数

很难判断,因为不清楚
testItemRepository::get
返回什么(它是否返回
选项
?)。尝试使用
flatMap
而不是
map
,并删除最后一行
orelsetrow
。是,它返回可选的。谢谢你的快速回答。