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

(0)

相关推荐

  • Java如何实现List自定义排序

    实体类 package com.whty.entity; public class User { private int id; private String name; private int age; public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public voi

  • Java中为何要使用ArrayList

    前言 当我们用于获取一组数据的时候,我们总是通过下面的格式定义变量. private List<Tag> tags = new ArrayList<>(); 我们熟悉的数组去哪了? 回顾数组 我们学习c语言,c++,会学到数组是存储同类型的一组数据.后来学习指针,知道了两种结构,链式结构与顺序结构.再后来学习数据结构.知道了两种结构的优缺点. 链式结构方便删除,添加. 顺序结构方便查找. 但是我们在实际使用中逐渐感受到数组在使用上的缺点.不仅仅是在定义时就要规定数组大小. 我们通过

  • Java List集合返回值去掉中括号(''[ ]'')的操作

    如下所示: 调用StringUtils工具类的strip()方法去掉中括号"[ ]": StringUtils.strip(word.toString(),"[]") //第一个参数放集合,第二个参数去掉中括号"[]" StringUtils工具类代码: package com.ktamr.common.utils; import com.ktamr.common.core.text.StrFormatter; import java.util.

  • java8 forEach结合Lambda表达式遍历 List操作

    我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E&quo

  • java list随机抽取元素的案例

    我就废话不多说了,大家还是直接看代码吧~ /** * 从list中随机抽取元素 * * @param list * @param n * @return void * @throws * @Title: createRandomList * @Description: TODO */ private static List createRandomList(List list, int n) { // TODO Auto-generated method stub Map map = new H

  • Java中List集合对象去重及按属性去重的8种方法

    最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java相关的基础知识进行穿针引线,进行整体上的总结. 总结java中创建并写文件的5种方式 总结java从文件中读取数据的6种方法 总结java创建文件夹的4种方法及其优缺点 总结java中删除文件或文件夹的7种方法 总结java中文件拷贝剪切的5种方式 比如之前我已经写了上面的这些内容,如果对java基

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

    一)背景 主要是为了实现数据之间的转换,方便数据展示. 使用场景:当数据可能是List<Object[]>类型,可能会需要转换成具体的List<Class>格式. 二)List<Object[]>转换成List<T> 功能:传入List<Object[]>数据和需要转换的Class对象,返回一个List<Class>数据集合 实现方式:Java反射方式,使用的是构造器的方式 缺点:实体类中必须有无参数构造器,有参数构造器,且构造器参数

  • Java实现字符串转换成可执行代码的方法

    使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能: import java.util.Map; import org.apache.commons.jexl2.Expression; import org.apache.commons.jexl2.JexlContext; import org.apache.commons.jexl2.JexlEngine; import org.apache.commons.jexl2.MapContext; /**

  • Java Optional<Foo>转换成List<Bar>的实例方法

    1.转换方法代码 public List<Bar> get(Optional<Foo> foo) { return foo.map(x -> x.getBazList() .stream() .map(Baz::getBar) .collect(Collectors.toList())) .orElse(Collections.emptyList()); } 或 public List<Bar> get(Optional<Foo> foo) { ret

  • java实现省市区转换成树形结构

    本文实例为大家分享了java实现省市区转换成树形结构的具体代码,供大家参考,具体内容如下 前言:为什我想写这篇博客呢?第一方面是记录,另一方面是分享. 1.创建数据库表 1.建表语句 CREATE TABLE `area` ( `AREA_CODE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '区域ID', `AREA_NAME` varchar(512) CHARACTER SET utf8

  • JavaScript中的object转换成number或string规则介绍

    在JavaScript程序编写过程中,根据不同的上下文,JS会自动将object转换成number或者string后再处理.这种自动转换的规则如下: object自动转换成string的规则: 1.如果object所属类覆写了toString()方法,则调用该方法.如果toString()调用的返回结果为Primitive(string.number.boolean.undefined.null),则将该Primitive值转换成string后返回. 2.如果object所属类没有覆写toStr

  • Java 中二进制转换成十六进制的两种实现方法

    Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static String toHex(byte[] result) { StringBuffer sb = new StringBuffer(result.length * 2); for (int i = 0; i < result.length; i++) { sb.append(Character.forDigi

  • DataFrame中的object转换成float的方法

    数据类型转换: 今天遇到一个问题,就是DataFrame类型的数据里是str型的数字,想把数字转换为int 或float:百度没有发现好的,也可能输入的关键字不对,找不到: DataFrame.info()之后发现数据全是object 之前有一个方法就是: 先traindata=np.array(traindata,dtype=np.float)之后在 traindata=pd.DataFrame(traindata)转换 但看着很繁琐,突发奇想,试到了下面的方法,一句就搞定得意得意 train

  • Java编程一维数组转换成二维数组实例代码

    简介:由于经常在使用矩阵进行计算时,会首先将一维数组转为二维数组.因此,在这里记录一下,也希望对他人有帮助. 实例代码: package deal; public class ArryTest { public static void main(String[] args) { //创建一个一维数组 0,1,2,3...,10 double [] c= new double[10]; for (int i = 0; i < c.length; i++) { c[i]=i; } double[][

  • python 将dicom图片转换成jpg图片的实例

    主要原理:调整dicom的窗宽,使之各个像素点上的灰度值缩放至[0,255]范围内. 使用到的python库:SimpleITK 下面是一个将dicom(.dcm)图片转换成jpg图片的demo: import SimpleITK as sitk import numpy as np import cv2 def convert_from_dicom_to_jpg(img,low_window,high_window,save_path): lungwin = np.array([low_win

  • java 读取excel文件转换成json格式的实例代码

    需要读取excel数据转换成json数据,写了个测试功能,转换正常: JSON转换:org.json.jar 测试类:  importFile.java: package com.siemens.util; import java.util.ArrayList; import java.util.List; import org.json.JSONException; import org.json.JSONObject; import org.apache.poi.ss.usermodel.R

随机推荐