gpt4 book ai didi

java - 将 map 解析为对象的优雅方式是什么?

转载 作者:行者123 更新时间:2023-12-04 08:05:34 24 4
gpt4 key购买 nike

我有一个随机对象,我需要解析 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
你能帮我找到最好的方法吗?

最佳答案

在您的情况下,我没有看到任何优雅的解决方案,但是您可以通过使用 map 来摆脱 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 - 将 map 解析为对象的优雅方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66239186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com