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

 更新时间:2020年09月15日 15:22:16   作者:ouyangjun__  
这篇文章主要介绍了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开发手册》学习整理。希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring aop之链式调用的实现

    spring aop之链式调用的实现

    这篇文章主要介绍了spring aop之链式调用的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • JAVA实现基于皮尔逊相关系数的相似度详解

    JAVA实现基于皮尔逊相关系数的相似度详解

    这篇文章主要介绍了JAVA实现基于皮尔逊相关系数的相似度详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java实现线程安全单例模式的五种方式的示例代码

    Java实现线程安全单例模式的五种方式的示例代码

    这篇文章主要介绍了Java中实现线程安全单例模式的五种方式:饿汉式、枚举单例、懒汉式、DCL懒汉式和静态内部类懒汉单例,感兴趣的可以了解一下
    2022-03-03
  • springboot项目mapper无法自动装配未找到 UserMapper 类型的Bean解决办法

    springboot项目mapper无法自动装配未找到 UserMapper 类型的Bean解决办法

    这篇文章给大家介绍了springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的 Bean解决办法(含报错原因),文章通过图文结合的方式介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-02-02
  • 深入理解Java线程池从设计思想到源码解读

    深入理解Java线程池从设计思想到源码解读

    这篇文章主要介绍了深入理解Java线程池从设计思想到源码解读,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Spring Boot中整合Spring Security并自定义验证代码实例

    Spring Boot中整合Spring Security并自定义验证代码实例

    本篇文章主要介绍了Spring Boot中整合Spring Security并自定义验证代码实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java 逻辑控制全面详解

    Java 逻辑控制全面详解

    程序的逻辑主要分为三种结构:顺序结构、分支结构、循环结构,顺序结构的所有的代码都是从前向后执行的。有些时候顺序是由“{}”为界限的,下文将全面详细的介绍
    2021-10-10
  • Java面试题冲刺第十五天--设计模式

    Java面试题冲刺第十五天--设计模式

    这篇文章主要为大家分享了最有价值的三道关于设计模式的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java判断两个集合是否具有交集及如何获得交集详解

    Java判断两个集合是否具有交集及如何获得交集详解

    这篇文章主要给大家介绍了关于Java判断两个集合是否具有交集及如何获得交集的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • SpringBoot中处理日期的两种方式小结

    SpringBoot中处理日期的两种方式小结

    本文主要介绍了SpringBoot中处理日期的两种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论