Java List Object[]转换成List T的实例

一)背景

主要是为了实现数据之间的转换,方便数据展示。

使用场景:当数据可能是List<Object[]>类型,可能会需要转换成具体的List<Class>格式。

二)List<Object[]>转换成List<T>

功能:传入List<Object[]>数据和需要转换的Class对象,返回一个List<Class>数据集合

实现方式:Java反射方式,使用的是构造器的方式

缺点:实体类中必须有无参数构造器,有参数构造器,且构造器参数的顺序和数据的顺序必须一致。如果数据格式有变化,需要重新编写一个实体类的构造器

实现源码:

package com.oysept.utils;

import java.lang.reflect.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 = clz.getConstructors();

for (Constructor<?> ct : cons) {

Class<?>[] clazz = ct.getParameterTypes();

if (objList.get(0).length == clazz.length) {

cz = clazz;

break;

}

}

List<T> list = new ArrayList<T>();

for (Object[] obj : objList) {

Constructor<T> cr = clz.getConstructor(cz);

list.add(cr.newInstance(obj));

}

return list;

}

}

三)实体类PhoneVO.java

package com.oysept.bean;

import java.io.Serializable;

import java.math.BigDecimal;

public class PhoneEntity implements Serializable {

private static final long serialVersionUID = 1L;

public PhoneEntity() {}

/**

* 构造器

* 注意: 实体类中必须有无参数构造器,有参数构造器,且构造器参数的顺序和数据的顺序必须一致。如果数据格式有变化,需要重新编写一个实体类的构造器

*/

public PhoneEntity(String plate, BigDecimal number, double memory, double size) {

super();

this.plate = plate;

this.number = String.valueOf(number);

this.memory = 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) { this.memory = memory; }

public String getSize() { return size; }

public void setSize(String size) { this.size = size;}

}

四)数据转换测试类

package com.oysept.test;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.List;

import com.oysept.bean.PhoneEntity;

import com.oysept.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(13699999999L);

obj[2] = 4.7;

obj[3] = 5.0;

Object[] obj1 = new Object[4];

obj1[0] = "vivo";

obj1[1] = BigDecimal.valueOf(13611111111L);

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.println(phone.getPlate() + "\t" + phone.getNumber()

+ "\t" + phone.getMemory() + "\t" + phone.getSize());

}

}

}

数据转换打印效果图:

补充知识: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.remove(0);

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开发手册》学习整理。希望能给大家一个参考,也希望大家多多支持。

以上是 Java List Object[]转换成List T的实例 的全部内容, 来源链接: utcz.com/z/327862.html

回到顶部