使用 BeanUtil 将 Map 与 Bean 进行相互转换
在使用fastjson的JSON和BeanMap,进行Bean对象和Map相互转换,
学习了这两种方式把Map和Bean相互转换,我们学习另外一个更好用的转换类 BeanUtil
用到类型之间的转换,就不得不提BeanUtil 这个类了
Hutool All 文档
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
引入:
Maven的方式:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.6</version>
</dependency>
0,数据准备:
参考 BeanMap 和Map对象相互转换 中的数据准备
1,将Bean对象转换为map
调用 BeanUtil 的 beanToMap(Object bean)
测试:
public static void main(String[] args) {
testChangeBeanToMap();
}
public static void testChangeBeanToMap(){
System.out.println("======== change bean to map ========");
Shape shape1 = new Shape("红色", "圆形");
Map<String, Object> shapeMap = BeanUtil.beanToMap(shape1);
System.out.println("change bean to map: "+shapeMap.toString());
}
结果:
======== change bean to map ========
change bean to map: {color=红色, type=圆形}
2,将map转换为Bean对象
调用 BeanUtil 的 mapToBean(Map<?, ?> map, Class<T> beanClass, boolean isToCamelCase, CopyOptions copyOptions)
public static void main(String[] args) {
testChangeMapToBean();
}
public static void testChangeMapToBean(){
System.out.println("========change map to bean ========");
Map<String,Object> single = new HashMap<>();
single.put("color","绿色");
single.put("type","三角形");
Shape shape2 = BeanUtil.mapToBean(single, Shape.class, false, new CopyOptions());
System.out.println("change map to bean: "+shape2.toString());
}
结果:
======== change map change to bean ========
change map to bean: Shape{color='绿色', type='三角形'}
3,将List<Bean>转换为List<Map<String, Object>>
代码:
/**
* 将List<Bean>转换为List<Map<String, Object>>
*
* @param sourceList
* @return
*/
public static <T> List<Map<String, Object>> beansToList(List<T> sourceList){
List<Map<String, Object>> destList =new ArrayList<>();
for(Object source: sourceList){
Map<String, Object> map = BeanUtil.beanToMap(source);
destList.add(map);
}
return destList;
}
测试:
public static void main(String[] args) {
testChangeBeansToList();
}
public static void testChangeBeansToList(){
List<Shape> shapeBeanList = ShapeFactory.create(10);
System.out.println("ori: "+ shapeBeanList.toString());
System.out.println("======== change list<Bean> to list<Map> ========");
List<Map<String, Object>> shapeList = beansToList(shapeBeanList);
System.out.println("change list<Bean> to list<Map>: "+ shapeList.toString());
System.out.println();
}
结果:
ori: [Shape{color='蓝色', type='平行四边形'}, Shape{color='绿色', type='扇形'}, Shape{color='橘色', type='扇形'}, Shape{color='棕色', type='长方形'}, Shape{color='红色', type='平行四边形'}, Shape{color='棕色', type='三角形'}, Shape{color='棕色', type='长方形'}, Shape{color='棕色', type='平行四边形'}, Shape{color='粉红色', type='扇形'}, Shape{color='红色', type='梯形'}]
======== change list<Bean> to list<Map> ========
change list<Bean> to list<Map>: [{color=蓝色, type=平行四边形}, {color=绿色, type=扇形}, {color=橘色, type=扇形}, {color=棕色, type=长方形}, {color=红色, type=平行四边形}, {color=棕色, type=三角形}, {color=棕色, type=长方形}, {color=棕色, type=平行四边形}, {color=粉红色, type=扇形}, {color=红色, type=梯形}]
4,将listmap转换成list实体类
代码:
/**
* 将List<Map<String,Object>>转换为List<Bean>
* @param sourceList
* @param destBeanClass
* @return
*/
public static <T> List<T> listsToBeans(List<Map<String, Object>> sourceList, Class<T> destBeanClass){
List<T> beanList=new ArrayList<>();
for(Map<String, Object> map: sourceList){
T dest = mapToBean(map, destBeanClass);
beanList.add(dest);
}
return beanList;
}
public static <T> T mapToBean(Map<String, Object> source, Class<T> destBeanClass){
return BeanUtil.mapToBean(source, destBeanClass, false, new CopyOptions());
}
测试:
public static void main(String[] args) {
testChangeListToBeans();
}
public static void testChangeListToBeans(){
System.out.println("======== change list<Map> to list<Bean> ========");
List<Map<String, Object>> shapeLists = ShapeListMapFactory.create(10);
System.out.println("ori: "+ shapeLists.toString());
List<Shape> shapeList1 = listsToBeans(shapeLists, Shape.class);
System.out.println("change list<Map> to list<Bean>: "+ shapeList1.toString());
}
结果:
======== change list<Map> to list<Bean> ========
ori: [{color=橘色, type=扇形}, {color=蓝色, type=圆形}, {color=粉红色, type=圆形}, {color=绿色, type=平行四边形}, {color=绿色, type=长方形}, {color=蓝色, type=扇形}, {color=绿色, type=圆形}, {color=棕色, type=平行四边形}, {color=绿色, type=圆形}, {color=粉红色, type=三角形}]
change list<Map> to list<Bean>: [Shape{color='橘色', type='扇形'}, Shape{color='蓝色', type='圆形'}, Shape{color='粉红色', type='圆形'}, Shape{color='绿色', type='平行四边形'}, Shape{color='绿色', type='长方形'}, Shape{color='蓝色', type='扇形'}, Shape{color='绿色', type='圆形'}, Shape{color='棕色', type='平行四边形'}, Shape{color='绿色', type='圆形'}, Shape{color='粉红色', type='三角形'}]
BeanUtils 代码
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class BeanUtils {
public static <T> T mapToBean(Map<String, Object> source, Class<T> destBeanClass){
return BeanUtil.mapToBean(source, destBeanClass, false, new CopyOptions());
}
/**
* 将List<Map<String,Object>>转换为List<Bean>
* @param sourceList
* @param destBeanClass
* @return
*/
public static <T> List<T> listsToBeans(List<Map<String, Object>> sourceList, Class<T> destBeanClass){
List<T> beanList=new ArrayList<>();
for(Map<String, Object> map: sourceList){
T dest = mapToBean(map, destBeanClass);
beanList.add(dest);
}
return beanList;
}
/**
* 将List<Bean>转换为List<Map<String, Object>>
*
* @param sourceList
* @return
*/
public static <T> List<Map<String, Object>> beansToList(List<T> sourceList){
List<Map<String, Object>> destList =new ArrayList<>();
for(Object source: sourceList){
Map<String, Object> map = BeanUtil.beanToMap(source);
destList.add(map);
}
return destList;
}
}
总结
BeanUtil进行类型之间的转换,比较方便好用。还有很多可能,可以多看看源码。
它的性能跟beanMap对比,如何呢?