使用BeanMapper把map和bean之间的转换,list<bean>和list<map>之间的转换(含测试)

本文介绍如何使用BeanMapper库进行Map与Bean,以及List<Bean>与List<Map>之间的高效转换,并提供了相关的测试案例。初篇技术分享,期待反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.zhiyou.video.test;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


import org.omg.CORBA.PUBLIC_MEMBER;


import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.zhiyou.video.model.User;
import com.zhiyou.video.model.result;


import net.sf.cglib.beans.BeanMap;
import sun.tools.tree.ThisExpression;


public class beanToMap {


/////// 将bena转换成map/////////////
public static <T> Map<String, Object> beanToMaps(T bean) {
Map<String, Object> map = Maps.newHashMap();
if (bean != null) {
BeanMap map2 = BeanMap.create(bean);
Iterator iterator = map2.keySet().iterator();
while (iterator.hasNext()) {
Object key = (Object) iterator.next();
if (map2.get(key) != null) {
if ((!key.toString().equals("id")) && map2.get(key).toString().equals("0")) {
continue;


}
map.put(key.toString(), map2.get(key));


}
}
}
return map;
}


///////////////// 将map转换成bean//////////////////////
@SuppressWarnings("unchecked")
public static <T> T mapToBean(Map map, T t) {


BeanMap beanMap1 = BeanMap.create(t);
beanMap1.putAll(map);
// beanMap1.getBean();
// return t;


beanMap1.getBean();


return t;


}
///////// List<bean>转换成List<Map<String,Objetc>>///////////


public static <T> List<Map<String, Object>> objectsToMaps(List<T> listbean) {
List<Map<String, Object>> maps = Lists.newArrayList();
if (listbean == null || listbean.size() == 0) {
return null;
}
for (T bean : listbean) {
if (bean != null) {
Map<String, Object> beanToMaps = beanToMaps(bean);
maps.add(beanToMaps);
}
}
return maps;
}


////////////// list<Map<String,Object>>转换成List<bean>///////////////////////////////////////////////
public static <T> List<T> listmapToBean(List<Map<String, Object>> listmap, T t) {
List<T> list = Lists.newArrayList();
if (listmap == null || listmap.size() == 0) {
return null;
}


for (Map<String, Object> map : listmap) {
T t1 = null;
try {
t1 = (T) t.getClass().newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
T t2 = mapToBean(map, t1);
System.out.println("t2" + t2);
list.add(t2);
}
return list;


}


/**
* List<?> list 可以赋值任何类型,但是不能添加具体的类型

* List<Object> list 只能赋值List<Object>,但是可以添加任何类型

* List<?extends Object> list 与 List<?> list没区别

*/
public static void main(String[] args) {


/////////////// bean转化成map测试////////////////////

{  System.out.println("bean转化成map测试");
 User user=new User(); 
 user.setId(1); 
 user.setNickName("张三");
 Map<String , Object>usermap = beanToMaps(user); 
for (String Userkey :usermap.keySet()) 
System.out.println("user的simplename:"+Userkey+usermap.get(Userkey));
 
}
 
////////////// map转化成bean测试//////////////
System.out.println("map转化成bean测试");
 Map<String, ? extends Object>map=ImmutableMap.of("id",2,"nickName","李华"); 
 Map<String ,?>map2=ImmutableMap.copyOf(map);
 User user2=null; 
 try { 
 user2 =mapToBean(map2,User.class.newInstance());
 } catch(InstantiationException e) 
 {  e.printStackTrace(); 
 } catch (IllegalAccessException e)
 { 
          e.printStackTrace();
          }
 System.out.println("map转化来的bean:"+user2);
 


/////////// 将List<T>转换成List<map<String,object>>测试//////////////
System.out.println("将List<T>转换成List<map<String,object>>测试");
List<User>users=Lists.newArrayList(new User(1, "张三"),new User(2,"李华"));
List<Map<String ,Object>>listmap=objectsToMaps(users); 
for (int i = 0; i <listmap.size(); i++) 
{
 Map<String , Object>shuxing=listmap.get(i);
 Iterator<Entry<String , Object>>
 iterator=shuxing.entrySet().iterator();
 while(iterator.hasNext()){
 Entry<String , Object>entry=iterator.next(); 
 String key=entry.getKey();
 Object value=entry.getValue();
 System.out.println("属性名为:"+key+"属性值为:"+value);
 
 }
 
 }
////////////////////list<map>转换成list<bean>//////////////
System.out.println("list<map>转换成list<bean>");
Map<String , ?>map0=ImmutableMap.of("id",1,"nickName","张三","city","郑州");
Map<String , Object>map01=ImmutableMap.copyOf(map0);
Map<String , ?>map1=ImmutableMap.of("id",2,"nickName","李四","sex",3);
Map<String , Object>map11=ImmutableMap.copyOf(map1);

List<Map<String, Object>>listmap1=Lists.newArrayList(map01,map11);
List<User>users1=null;

try {
users1=listmapToBean(listmap1,User.class.newInstance());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(users);
for (User user1 : users) {

System.out.println("User的信息为:"+user1.getId()+user1.getNickName()+user1.getSex());
}




}

}

最后:第一篇文章,先试试水,欢迎留言!!!

<think>我们使用Hutool的BeanUtil.beanToMap方法将单个Java Bean转换Map,然后对List中的每个元素进行转换即可。 注意:如果Bean中有日期等特殊类型,可能需要处理,但Hutool默认会进行转换(日期转换为DateTime对象或时间戳,可通过参数控制)。 另外,Hutool的BeanUtil.beanToMap方法默认会忽略值为null的属性,但可以通过第二个参数控制是否忽略。 步骤: 1. 引入Hutool依赖(如果尚未引入)。 2. 使用Java 8 Stream或循环遍历List,对每个Bean调用BeanUtil.beanToMap方法。 3. 将每个转换后的Map收集到新的List中。 代码示例: 假设有一个User类: public class User { private String name; private int age; // 省略getter/setter构造方法 } 转换代码: import cn.hutool.core.bean.BeanUtil; import java.util.ArrayList; import java.util.List; import java.util.Map; public class BeanToListMapExample { public static void main(String[] args) { // 准备Bean列表 List<User> userList = new ArrayList<>(); userList.add(new User("Alice", 25)); userList.add(new User("Bob", 30)); // 转换: 使用BeanUtil.beanToMap将每个Bean转换Map List<Map<String, Object>> mapList = new ArrayList<>(); for (User user : userList) { // 默认情况下,beanToMap会忽略值为null的属性,并且不会转换为驼峰式(原样输出字段名) Map<String, Object> map = BeanUtil.beanToMap(user); mapList.add(map); } // 或者使用Java 8 Stream List<Map<String, Object>> mapList2 = userList.stream() .map(user -> BeanUtil.beanToMap(user)) .collect(Collectors.toList()); // 输出结果 System.out.println(mapList); } } 注意事项: 1. 默认情况下,BeanUtil.beanToMap方法不会将字段名转换为驼峰式,而是保持原样(即Bean中的属性名一致)。如果希望驼峰转下划线,可以使用BeanUtil.beanToMap的另一个重载方法,并指定选项。 2. 如果Bean中有嵌套对象,默认会转换Map(递归转换),但可能不是所有情况都符合预期,需要根据实际情况处理。 3. 如果希望忽略某些字段,可以在beanToMap方法后手动移除,或者使用@Transient注解(Hutool支持)标记字段。 另外,Hutool还提供了BeanUtil.toBean方法用于将Map转回Bean。 因此,用户的问题可以通过上述方式解决。 生成相关问题: 1. 如何将List<Map>转换回List<Bean>? 2.转换过程中如何忽略某些字段? 3. 如何处理Bean中的嵌套对象(即Bean属性是另一个Bean)? 4. 如何将字段名转换为下划线命名(驼峰转下划线)? 参考引用:用户提供的引用内容中提到了循环遍历Java8 Stream的方式,以及工具类转换,这与我们的方法一致[^1][^2]。</think>### 使用 Hutool 将 List<Bean> 转换为 List<Map<String, Object>> 在 Java 中,使用 Hutool 工具库可以高效地将对象列表转换Map 列表。核心方法是 `BeanUtil.beanToMap()`,它支持灵活的字段控制类型转换。以下是详细实现步骤: #### 步骤说明 1. **添加 Hutool 依赖** ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> <!-- 使用最新版本 --> </dependency> ``` 2. **转换逻辑** - 遍历 Bean 列表 - 对每个 Bean 调用 `BeanUtil.beanToMap()` 转换为 `Map<String, Object>` - 支持字段过滤、驼峰转换等配置 #### 完整代码示例 ```java import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.ListUtil; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class BeanToMapConverter { // 示例 Bean 类 static class Product { private Long id; private String name; private Double price; // 构造方法/getter/setter 省略 } public static void main(String[] args) { // 1. 创建 Bean 列表 List<Product> beanList = ListUtil.of( new Product(1L, "Laptop", 5999.0), new Product(2L, "Phone", 3999.0) ); // 2. 转换Map 列表 (基础版) List<Map<String, Object>> mapList = beanList.stream() .map(bean -> BeanUtil.beanToMap(bean)) .collect(Collectors.toList()); System.out.println("基础转换结果: " + mapList); // 输出: [{id=1, name=Laptop, price=5999.0}, {id=2, name=Phone, price=3999.0}] // 3. 高级转换(带配置) List<Map<String, Object>> mapListWithConfig = beanList.stream() .map(bean -> BeanUtil.beanToMap( bean, new LinkedHashMap<>(), // 使用有序Map false, // 是否忽略null值 true // 驼峰转下划线 )) .collect(Collectors.toList()); System.out.println("驼峰转下划线结果: " + mapListWithConfig); // 输出: [{id=1, name=Laptop, product_price=5999.0}, ...] } } ``` #### 关键配置参数 | 参数 | 类型 | 说明 | 默认值 | |------|------|------|--------| | `isToUnderlineCase` | boolean | 驼峰转下划线(如:`userName` → `user_name`) | `false` | | `ignoreNullValue` | boolean | 是否忽略 null 值字段 | `false` | | `copyOptions` | CopyOptions | 自定义字段映射规则 | - | #### 嵌套对象处理 当 Bean嵌套对象时,Hutool 会自动递归转换: ```java class Order { private Long orderId; private Product product; // 嵌套对象 } List<Map<String, Object>> result = orderList.stream() .map(order -> BeanUtil.beanToMap(order, true, true)) .collect(Collectors.toList()); // 输出: [{orderId: 100, product: {id:1, name:"Laptop"}}] ``` #### 性能建议 1. **批量处理**:对于 10,000+ 数据量,使用并行流提升速度: ```java List<Map<String, Object>> result = beanList.parallelStream() .map(bean -> BeanUtil.beanToMap(bean)) .collect(Collectors.toList()); ``` 2. **字段过滤**:减少不必要的字段转换 3. **缓存配置**:重复使用 `CopyOptions` 对象 > **注意**:日期类型默认转为 `Date` 对象,可通过 `CopyOptions.setDateFormatter()` 自定义格式[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值