2013-01-08 43 views
2

我有一個對象類型的列表,例如Customer類(屬性:customerId,customerName)和一個String數組。將java.util.list轉換爲數組的客戶轉換器

是否有任何方式來填充/獲取列表中的所有customerName數組? (除了手動在列表遍歷)

Customer c1 = new Customer(1,"ABC"); 
Customer c2 = new Customer(2,"DEF"); 
Customer c3 = new Customer(3,"XYZ"); 
List<Customer> list = new ArrayList<Customer>(); 
list.put(c1); list.put(c2); list.put(c3); 

String[] allCustomerNames = new String[list.size()]; 
//Code to get allCustomerNames populated. 
//Ofcourse, other than to iterate through list 

有什麼辦法這將是類似於......

allCustomerNames = list.toArray(customerNameConvertor); 

其中customerNameConveror是假設轉換器類,它會告訴使用客戶名稱數組元素的數量。

+0

您可以使用[JOSQL(http://josql.sourceforge.net)到你的列表查詢。 –

+0

沒有辦法得到沒有迭代的名字,但你可以將你的名字同時添加到另一個列表中,然後將其轉換爲數組... –

回答

5

您可以使用第三方庫,如GuavaF4J

這是怎麼能像番石榴:

Function<Customer, String> customerToName = new Function<Customer, String>() { 
     public String apply(Customer c) { 
      return c.getName(); 
     }; 

List<String> allCustomerNamesList = Lists.transform(list, customerToName); 

如果你需要一個數組,你將不得不使用正常指定者方法:allCustomerNames = allCustomerNamesList.toArray(allCustomerNames);

+0

會試試這個,謝謝。 –

+0

+1,還有一點需要注意,它仍然在內部遍歷列表 - 但是,迭代位在庫中完成,客戶端只需要知道功能位是否合適。 – Scorpion

1

你可以寫一個實用工具類,像這個。您可以獲得所有字段的值數組。

public class FieldToArrayConvertor { 
    public static Object[] getFieldValuesFromEntityList(List list, String fieldName) throws Exception { 
     Object[] array = new Object[list.size()]; 
     int i=0; 
     for(Object o : list) { 
      Class<? extends Object> aClass = o.getClass(); 
      Field field = aClass.getDeclaredField(fieldName); 
      Object invoke = field.get(o); 
      array[i]= invoke; 
      i++; 
     } 
     return array; 
    } 
    public static void main(String[] args) { 
     try { 
      Employee em = new Employee("emp1"); 
      Employee em1 = new Employee("emp2"); 
      List<Employee> list1= new ArrayList() ; 
      list1.add(em); 
      list1.add(em1); 
      Object[] field = getFieldValuesFromEntityList(list1, "name"); 
      for(Object o: field) { 
       System.out.println(o); 
      } 
     } catch (Exception ex) { 
      Logger.getLogger(FieldToArrayConvertor.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

另請參見:Uses of Reflection