2

我有一个对象类型的列表,比如客户类(属性:customerId,customerName)和一个字符串数组。

有没有办法用列表中的所有 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 是假设的转换器类,它将告诉使用 customerName 来填充数组元素。

4

2 回答 2

5

您可以使用GuavaF4J等第三方库来完成。

这就是它在 Guava 中的样子:

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

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

如果你需要一个数组,你必须使用普通的 toArray 方法:allCustomerNames = allCustomerNamesList.toArray(allCustomerNames);

于 2013-01-08T06:35:41.543 回答
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);
        }
    }
}

另请参阅: 反射的使用

于 2013-01-08T06:50:31.023 回答