我有一个随机对象,我需要解析 Map
public class ExternalIncome {
private Long operationId;
private OffsetDateTime operationDate;
private String operationCode;
private String documentNumber;
private OffsetDateTime documentDate;
private String correspondentInn;
private String correspondentName;
private String correspondentAccount;
}
我刚刚这样创建了它,但我认为它不太优雅,相当丑陋。另外,我需要拦截解析的每次迭代,以将动态字段保存到对象内部的 Map
public static ExternalIncome create(Map<String, String> fields) {
ExternalIncome externalIncome = new ExternalIncome();
fields.forEach((k, v) -> {
switch (k) {
case "OPER_ID":
externalIncome.setOperationId(nullableLong(v));
break;
case "OPER_DATE":
externalIncome.setOperationDate(Utils.toOffsetDateTime(v));
break;
etc
你能帮我找到最好的方法吗?
最佳答案
在您的情况下,我没有看到任何优雅的解决方案,但是您可以通过使用映射来摆脱 switch/case,其中键是字段映射中的字段名称,值是 BiDirectionalConsumer。可能不是最好的解决方案,但仍然如此。注意:要小心强制转换和类型转换。
假设您有字段映射:
Map<String, String> fields = new HashMap<>();
fields.put("OPER_ID", "3");
您可以使用字段名称和要执行的操作定义第二个映射:
HashMap<String, BiConsumer<ExternalIncome, Object>> fieldsOperations = new HashMap<>();
fieldsOperations.put("OPER_ID", (extIncome, valueToSet) ->
extIncome.setOperationId(Long.valueOf((String) valueToSet))); //add as many as you want
然后用字段迭代 map :
ExternalIncome externalIncome = new ExternalIncome();
fields.forEach((k,v) -> {
BiConsumer<ExternalIncome, Object> operation = fieldsOperations.get(k);
if (operation == null) {
//add to dynamic fields map
return;
}
operation.accept(externalIncome, v);
});
或者您可以重新考虑您的数据结构,以摆脱拥有动态字段的想法,但我不知道您的用例是否可能。
关于java - 将映射解析为对象的优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66239186/