如何使用Stream API将含嵌套枚举集合的枚举结构转换为Map<InternalErrorCode, ExternalErrorCode>
解决Stream API构建
InternalErrorCode到ExternalErrorCode的Map问题 我明白你的困惑啦!你现在想用Stream把ExternalErrorCode枚举转换成Map<InternalErrorCode, ExternalErrorCode>,但groupingBy其实不是正确的选择——因为groupingBy会把相同key的元素分组(返回Map<K, List<V>>),而你需要的是一对一的映射(每个InternalErrorCode唯一对应一个ExternalErrorCode)。
正确的实现方式
核心思路是先展开每个ExternalErrorCode对应的InternalErrorCode集合,把每个InternalErrorCode和它所属的ExternalErrorCode配对,再收集成Map。代码如下:
@Getter @RequiredArgsConstructor public enum ExternalErrorCode { ERROR1(Set.of(InternalErrorCode.FOO, InternalErrorCode.BAR)), ERROR2(Set.of(InternalErrorCode.ZOO)); // 修正后的LOOKUP_BY_ERROR_CODE实现 private static final Map<InternalErrorCode, ExternalErrorCode> LOOKUP_BY_ERROR_CODE = Stream.of(values()) .filter(external -> !external.getErrorCode().isEmpty()) // 把每个ExternalErrorCode拆成多个(Internal, External)键值对 .flatMap(external -> external.getErrorCode().stream() .map(internal -> new AbstractMap.SimpleEntry<>(internal, external))) // 收集成Map,因为InternalErrorCode不会重复,无需处理冲突 .collect(Collectors.toMap( AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue )); private final Set<InternalErrorCode> errorCode; }
步骤拆解
- 过滤空集合:先用
filter排除那些errorCode为空的枚举值,避免无效数据。 - 展开配对:通过
flatMap把每个ExternalErrorCode对应的Set<InternalErrorCode>拆分成单个元素,同时用SimpleEntry把每个InternalErrorCode和当前的ExternalErrorCode绑定在一起。 - 收集成Map:用
Collectors.toMap直接将键值对收集为目标Map。因为题目明确说明InternalErrorCode在所有枚举中不会重复,所以不需要额外的冲突合并函数(如果有重复的情况,才需要传入第三个参数处理)。
这样得到的LOOKUP_BY_ERROR_CODE就完全符合你的期望:
InternalErrorCode.FOO→ExternalErrorCode.ERROR1InternalErrorCode.BAR→ExternalErrorCode.ERROR1InternalErrorCode.ZOO→ExternalErrorCode.ERROR2
内容的提问来源于stack exchange,提问作者Viktor M.
相关产品推荐
相关产品推荐

