在Spring中将字符串值映射到bean

在Spring中将字符串值映射到bean,spring,Spring,假设我们有一个这样的豆子: @Data class MyBean{ private String name: private String age; private String gender; ... } 和另一个带有顺序变量的bean @Data class Order{ private String orderVariable; private String orderValue; } 我有一份订单单 [ "mygender","M"],

假设我们有一个这样的豆子:

@Data
class MyBean{

private String name:
private String age;
private String gender;
...
}
和另一个带有顺序变量的bean

@Data
class Order{

private String orderVariable;
private String orderValue;


}
我有一份订单单

[ "mygender","M"], ["myname", "Louis"],["myage", 12]...
[ "mygender","F"], ["myage", 13], ["myname", "Anna"]...
[ "myname", "Peter"], ["myage", 14], ["mygender","M"]...
我需要映射两个:

List<MyBean> myBeanList = new ArrayList<>();

for(Order order: ordersList){
    MyBean myBean = new MyBean();
    if(order.getOrderVariable().equals("myname")){
      myBean.setname(order.orderValue());
    }
    else if(order.getOrderVariable().equals("mygender")){
      myBean.setGender(order.orderValue());
     }
    else if(order.getOrderVariable().equals("myage")){
      myBean.setAge(order.orderValue());
    }
...
}
List myBeanList=new ArrayList();
对于(订单:订单列表){
MyBean MyBean=新的MyBean();
if(order.getOrderVariable().equals(“myname”)){
setname(order.orderValue());
}
else if(order.getOrderVariable().equals(“mygender”)){
设置性别(order.orderValue());
}
else if(order.getOrderVariable().equals(“myage”)){
设置(order.orderValue());
}
...
}

问题是我在MyBean中有20多个变量,所以这不是最干净的方法。我该怎么做?

我建议创建一个哈希映射,将每个
orderVariable
映射到一个
BiConsumer
。这个消费者基本上是为
MyBean
中的每个字段持有lambda到setter方法

这将如下所示:

Map dispatch=newhashmap(){{
put(“myname”,(order,myBean)->myBean.setName(order.getOrderValue());
put(“mygender”,(order,myBean)->myBean.setGender(order.getOrderValue());
put(“myage”,(order,myBean)->myBean.setAge(order.getOrderValue());
//为其他字段添加其他使用者
}};
对于(订单:订单列表){
MyBean MyBean=新的MyBean();
dispatch.getOrDefault(order.getOrderVariable(),(unusedOrder,unusedMyBean)->{}.accept(order,myBean);
//用myBean做点什么
}
另一种方法是使用反射,尽管我通常不推荐使用反射,因为反射非常脆弱且容易出错

publicstaticvoidmain(字符串[]args)抛出IllegaccessException{
对于(订单:订单列表){
MyBean MyBean=新的MyBean();
//从MyBean获取所有字段
Field[]fields=myBean.getClass().getDeclaredFields();
用于(字段:字段){
//检查字段名是否与order中的orderVariable值相似。
if(order.getOrderVariable().contains(field.getName())){
//使字段可通过反射进行编辑。
字段。setAccessible(true);
//设置字段值
set(myBean,order.getOrderValue());
//重置字段的可访问性
字段.setAccessible(false);
}
}
//在这里做点什么
}
}

您可以更改bean吗?例如,
Order
可以改为
Map
吗?当然可以。至少我可以改变事实上,看看你的数据,这不会有帮助-每个键都不是唯一的