假设我有一个枚举:
public enum SomeType {
TYPE1, TYPE2, TYPE3
}
我将API响应映射到返回SomeType
的服务,并将附加数据映射到Map<SomeType, SomeTypeDetails>
:
private Map<SomeType, SomeTypeDetails> mapSomeTypeResponseJson(String someTypeResponseJSON) {
JSONObject someTypeResponse = new JSONObject(someTypeResponseJSON);
return someTypeResponse.toMap().entrySet()
.stream()
.collect(Collectors.toMap(
Map.Entry::getKey, someTypeMap ->
myObjectMapper.getObjectMapper()
.convertValue(someTypeMap.getValue(), SomeTypeDetails.class))
);
}
但我无法控制响应,其他团队可能会向他们的SomeType
枚举添加一些新值,例如TYPE4
和TYPE5
,而我还没有很快得到有关添加的信息。
是否有可能使上面的mapSomeTypeResponseJson
方法(我处理响应的entrySet()
的部分(忽略未知的SomeType
值,或者——甚至更好——以这样的方式进行,即我可以捕获IllegalArgumentException
和LOGGER.warn()
,甚至可以进行一些更复杂的错误处理?
你可以这样做来忽略你没有配置的类型:
private Map<SomeType, SomeTypeDetails> mapSomeTypeResponseJson(String someTypeResponseJSON) {
JSONObject someTypeResponse = new JSONObject(someTypeResponseJSON);
final Set<SomeType> types = Set.of("TYPE1","TYPE2","TYPE3");
return someTypeResponse.toMap().entrySet()
.stream()
.peek(entry -> {
if (!types.contains(entry.getKey())) {
System.out.println(entry.getKey() + " is not registered yet.");
}
})
.filter(es -> types.contains(es.getKey()))
.collect(Collectors.toMap(
Map.Entry::getKey, someTypeMap ->
myObjectMapper.getObjectMapper()
.convertValue(someTypeMap.getValue(), SomeTypeDetails.class))
);
}