溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java List Object[]實(shí)現(xiàn)轉(zhuǎn)換成List T的方法

發(fā)布時(shí)間:2020-11-03 18:07:07 來(lái)源:億速云 閱讀:955 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)Java List Object[]實(shí)現(xiàn)轉(zhuǎn)換成List T的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

List<Object[]>轉(zhuǎn)換成List<T>

功能:傳入List<Object[]>數(shù)據(jù)和需要轉(zhuǎn)換的Class對(duì)象,返回一個(gè)List<Class>數(shù)據(jù)集合

實(shí)現(xiàn)方式:Java反射方式,使用的是構(gòu)造器的方式

缺點(diǎn):實(shí)體類(lèi)中必須有無(wú)參數(shù)構(gòu)造器,有參數(shù)構(gòu)造器,且構(gòu)造器參數(shù)的順序和數(shù)據(jù)的順序必須一致。如果數(shù)據(jù)格式有變化,需要重新編寫(xiě)一個(gè)實(shí)體類(lèi)的構(gòu)造器

實(shí)現(xiàn)源碼:

package com.oysept.utils; 
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
 
/**
 * List<Object[]>轉(zhuǎn)換成一個(gè)List<T>
 * @author ouyangjun
 */
public class ObjectToBeanUtils {
 
 /**
  * 把List<Object[]>轉(zhuǎn)換成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<&#63;>[] cz = null;
  Constructor<&#63;>[] cons = clz.getConstructors();
  for (Constructor<&#63;> ct : cons) {
   Class<&#63;>[] 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;
 }
}

實(shí)體類(lèi)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() {}
 
 /**
  * 構(gòu)造器
  * 注意: 實(shí)體類(lèi)中必須有無(wú)參數(shù)構(gòu)造器,有參數(shù)構(gòu)造器,且構(gòu)造器參數(shù)的順序和數(shù)據(jù)的順序必須一致。如果數(shù)據(jù)格式有變化,需要重新編寫(xiě)一個(gè)實(shí)體類(lèi)的構(gòu)造器
  */
 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;}
} 

數(shù)據(jù)轉(zhuǎn)換測(cè)試類(lèi)

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;
 
/**
 * 測(cè)試類(lèi)
 * @author ouyangjun
 */
public class ObjectToBeanTest {
 
 public static void main(String[] args) throws Exception {
  // 初始化數(shù)據(jù)
  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);
 
  // 工具類(lèi)
  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());
  }
 }
}

數(shù)據(jù)轉(zhuǎn)換打印效果圖:

Java List Object[]實(shí)現(xiàn)轉(zhuǎn)換成List T的方法

補(bǔ)充知識(shí):List、List<Object>、List<&#63;>的區(qū)別

通過(guò)一個(gè)例子來(lái)比較這幾種寫(xiě)法的區(qū)別

Java List Object[]實(shí)現(xiàn)轉(zhuǎn)換成List T的方法

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"));
 
  // 第二段:把a(bǔ)1賦值給List<Object>類(lèi)型的a2,看似a2與a1沒(méi)有區(qū)別
  List<Object> a2 = a1;
  a2.add(new Object());
  a2.add(new Integer(2));
  a2.add(new String("a2"));
  // 但是如果嘗試把一個(gè)帶有其它類(lèi)型泛型的b2賦值給a2,則會(huì)編譯報(bào)錯(cuò)
  List<String> b2 = new ArrayList<>();
  // 編譯報(bào)錯(cuò),這也是List與List<Object>的區(qū)別
  a2 = b2;
 
  // 第三段:把a(bǔ)1賦值給List<Integer>類(lèi)型的a3,賦值過(guò)程沒(méi)有編譯報(bào)錯(cuò),主要為了向前兼容(泛型jdk1.5之后才出現(xiàn))
  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);
  // 編譯報(bào)錯(cuò),不允許add非Integer類(lèi)型
  a3.add(new Object());
  a3.add(new String("a3"));
 
  // 第四段:把a(bǔ)1賦值給List<&#63;>類(lèi)型的a4
  List<&#63;> a4 = a1;
  a4.remove(0);
  a4.clear();
  a4.add(null);
  // 編譯出錯(cuò),不允許add非null的數(shù)據(jù)
  a4.add(new Object());
 }
}

1、第一段:定義了一個(gè)沒(méi)使用泛型的List a1,向a1中添加不同類(lèi)型的元素,所有功能都可以正常使用,但使用時(shí)會(huì)有類(lèi)型強(qiáng)制轉(zhuǎn)換異常的風(fēng)險(xiǎn)。

2、第二段:把a(bǔ)1賦值給List<Object>類(lèi)型的a2,再往a2添加不同類(lèi)型元素,不會(huì)編譯報(bào)錯(cuò),看似a2與a1沒(méi)有區(qū)別,但是如果嘗試把一個(gè)帶有其它類(lèi)型泛型(List<String>)的b2賦值給a2,則會(huì)編譯報(bào)錯(cuò),除非讓泛型保持一致。

這也是List與List<Object>的區(qū)別:泛型之間只有同類(lèi)型才能相互賦值。

3、第三段:把a(bǔ)1賦值給List<Integer>類(lèi)型的a3,賦值過(guò)程沒(méi)有編譯報(bào)錯(cuò),主要為了向前兼容(泛型jdk1.5之后才出現(xiàn)),但如果直接用Integer類(lèi)型取值,會(huì)報(bào)類(lèi)型轉(zhuǎn)換異常。因?yàn)閍3有了泛型約束,再添加其它類(lèi)型元素,則會(huì)編譯報(bào)錯(cuò)。

4、List<&#63;>是通配符集合,一般作為參數(shù)來(lái)接收外部的集合,或者返回一個(gè)不知道具體元素類(lèi)型的集合。它可以被任何類(lèi)型的集合引用賦值,也可以刪除元素。但是因?yàn)轭?lèi)型的不確定,所有不能添加非null元素(null屬于任何類(lèi)型)。

以上就是Java List Object[]實(shí)現(xiàn)轉(zhuǎn)換成List T的方法,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI