在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
吗?当然可以。至少我可以改变事实上,看看你的数据,这不会有帮助-每个键都不是唯一的