JavaListObject[]转换成ListT的实例
⼀)背景
主要是为了实现数据之间的转换,⽅便数据展⽰。
使⽤场景:当数据可能是List<Object[]>类型,可能会需要转换成具体的List<Class>格式。
⼆)List<Object[]>转换成List<T>
功能:传⼊List<Object[]>数据和需要转换的Class对象,返回⼀个List<Class>数据集合
实现⽅式:Java反射⽅式,使⽤的是构造器的⽅式
缺点:实体类中必须有⽆参数构造器,有参数构造器,且构造器参数的顺序和数据的顺序必须⼀致。如果数据格式有变化,需要重新编写⼀个实体类的构造器
实现源码:
sept.utils;
import flect.Constructor;
import java.util.ArrayList;
import java.util.List;
/**
* List<Object[]>转换成⼀个List<T>
* @author ouyangjun
*/
public class ObjectToBeanUtils {
/**
* 把List<Object[]>转换成List<T>
*/
public static <T> List<T> objectToBean(List<Object[]> objList, Class<T> clz) throws Exception{
if (objList==null || objList.size()==0) {
return null;
}
Class<?>[] cz = null;
Constructor<?>[] cons = Constructors();
for (Constructor<?> ct : cons) {
Class<?>[] clazz = ct.getParameterTypes();
if ((0).length == clazz.length) {
cz = clazz;
break;
}
}
List<T> list = new ArrayList<T>();
for (Object[] obj : objList) {
Constructor<T> cr = Constructor(cz);
list.wInstance(obj));
}
return list;
}
}
三)实体类PhoneVO.java
sept.bean;
import java.io.Serializable;
import java.math.BigDecimal;
public class PhoneEntity implements Serializable {
private static final long serialVersionUID = 1L;
public PhoneEntity() {}
/**
* 构造器
* 注意: 实体类中必须有⽆参数构造器,有参数构造器,且构造器参数的顺序和数据的顺序必须⼀致。如果数据格式有变化,需要重新编写⼀个实体类的构造器
object to*/
public PhoneEntity(String plate, BigDecimal number, double memory, double size) {
super();
this.plate = plate;
this.number = String.valueOf(number);
< = String.valueOf(memory);
this.size = String.valueOf(size);
}
private String plate;
private String number;
private String memory;
private String size;
public String getPlate() { return plate; }
public void setPlate(String plate) { this.plate = plate; }
public String getNumber() { return number; }
public void setNumber(String number) { this.number = number; }
public String getMemory() { return memory; }
public void setMemory(String memory) { = memory; }
public String getSize() { return size; }
public void setSize(String size) { this.size = size;}
}
四)数据转换测试类
st;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
sept.bean.PhoneEntity;
sept.utils.ObjectToBeanUtils;
/**
* 测试类
* @author ouyangjun
*/
public class ObjectToBeanTest {
public static void main(String[] args) throws Exception {
// 初始化数据
Object[] obj = new Object[4];
obj[0] = "hw";
obj[1] = BigDecimal.valueOf(136********L);
obj[2] = 4.7;
obj[3] = 5.0;
Object[] obj1 = new Object[4];
obj1[0] = "vivo";
obj1[1] = BigDecimal.valueOf(136********L);
obj1[2] = 4.8;
obj1[3] = 5.7;
List<Object[]> objList = new ArrayList<Object[]>();
objList.add(obj);
objList.add(obj1);
// ⼯具类
List<PhoneEntity> list = ObjectToBeanUtils.objectToBean(objList, PhoneEntity.class); for (PhoneEntity phone : list) {
System.out.Plate() + "\t" + Number()
+ "\t" + Memory() + "\t" + Size());
}
}
}
数据转换打印效果图:
补充知识:List、List<Object>、List<?>的区别
通过⼀个例⼦来⽐较这⼏种写法的区别
public class ListWithoutGeneric {
public static void main(String[] args) {
// 第⼀段:不使⽤泛型的⽅式
List a1 = new ArrayList();
a1.add(new Object());
a1.add(new Integer(1));
a1.add(new String("a1"));
// 第⼆段:把a1赋值给List<Object>类型的a2,看似a2与a1没有区别
List<Object> a2 = a1;
a2.add(new Object());
a2.add(new Integer(2));
a2.add(new String("a2"));
// 但是如果尝试把⼀个带有其它类型泛型的b2赋值给a2,则会编译报错
List<String> b2 = new ArrayList<>();
// 编译报错,这也是List与List<Object>的区别
a2 = b2;
// 第三段:把a1赋值给List<Integer>类型的a3,赋值过程没有编译报错,主要为了向前兼容(泛型jdk1.5之后才出现) List<Integer> a3 = a1;
a3.add(new Integer(3));
// java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Integer
Integer integer = a3.get(0);
// 编译报错,不允许add⾮Integer类型
a3.add(new Object());
a3.add(new String("a3"));
// 第四段:把a1赋值给List<?>类型的a4
List<?> a4 = a1;
a4.clear();
a4.add(null);
// 编译出错,不允许add⾮null的数据
a4.add(new Object());
}
}
1、第⼀段:定义了⼀个没使⽤泛型的List a1,向a1中添加不同类型的元素,所有功能都可以正常使⽤,但使⽤时会有类型强制转换异常的风险。
2、第⼆段:把a1赋值给List<Object>类型的a2,再往a2添加不同类型元素,不会编译报错,看似a2与a1没有区别,但是如果尝试把⼀个带有其它类型泛型(List<String>)的b2赋值给a2,则会编译报错,除⾮让泛型保持⼀致。
这也是List与List<Object>的区别:泛型之间只有同类型才能相互赋值。
3、第三段:把a1赋值给List<Integer>类型的a3,赋值过程没有编译报错,主要为了向前兼容(泛型jdk1.5之后才出现),但如果直接⽤Integer类型取值,会报类型转换异常。因为a3有了泛型约束,再添加其它类型元素,则会编译报错。
4、List<?>是通配符集合,⼀般作为参数来接收外部的集合,或者返回⼀个不知道具体元素类型的集合。它可以被任何类型的集合引⽤赋值,也可以删除元素。但是因为类型的不确定,所有不能添加⾮null元素(null属于任何类型)。
以上内容根据《码出⾼效Java开发⼿册》学习整理。希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论