此方法不限制List集合泛型中bean的类型,以及Map中的key具体取哪个字段和字段的个数,多个字段之间用英文下划线_连接。可取private字段为key,可以忽略掉List中的null值
/**
* List 转换为 Map 多个字段之间默认以_连接
*
* @param list 需要转换的List
* @param fields 以那些字段当做key
* @param <T>
* @return
*/
private <T> Map<String, T> toMap(List<T> list, String... fields) throws IllegalAccessException, NoSuchFieldException {
Map<String, T> map = Maps.newHashMap();
if (CollectionUtils.isEmpty(list)) {
return map;
}
if (fields.length < 0) {
return map;
}
for (T t : list) {
if (t != null) {
//map中的Key
StringBuffer key = new StringBuffer();
Class<?> aClass = t.getClass();
for (int i = 0; i < fields.length; i++) {
String field = fields[i];
if (StringUtils.isBlank(field)) {
throw new RuntimeException("字段名为空");
}
//通过暴力反射获取字段值
Field declaredField = aClass.getDeclaredField(field);
declaredField.setAccessible(true);
String s = String.valueOf(declaredField.get(t));
key.append(s);
if (i < fields.length - 1) {
key.append("_");
}
}
map.put(key.toString(),t);
}
}
return map;
}
测试
实体
package cn.itcast.mytest.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@ApiModel("用户实体")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("用户Id")
private Integer id;
@ApiModelProperty("姓名")
private String userName;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("学号")
private Integer student;
@ApiModelProperty("性别")
private String gender;
@ApiModelProperty("钱")
private Double money;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("账号")
private String name;
@ApiModelProperty("密码")
private String pwd;
}
测试代码
@Test
void testToMap() throws IllegalAccessException, NoSuchFieldException {
User u = new User();
u.setId(1);
u.setUserName("123");
User u1 = new User();
u1.setId(2);
u1.setUserName("abc");
User u2 = null;
List<User> list = Lists.newArrayList();
list.add(u);
list.add(u1);
list.add(u2);
Map<String, User> stringUserMap = toMap(list, "id", "userName");
System.out.println(stringUserMap);
}
运行结果
{
2_abc=User(id=2, userName=abc, age=null, student=null, gender=null, money=null, createTime=null, name=null, pwd=null),
1_123=User(id=1, userName=123, age=null, student=null, gender=null, money=null, createTime=null, name=null, pwd=null)
}