2011-05-20 21 views
11

Duplicar posibles:
How to convert a Java object (bean) to key-value pairs (and vice versa)?Convertir un POJO a un mapa <K,V>

¿Cuál es la mejor manera de convertir una List<POJO> to a List<Map<K,V>>. ¿Hay un método personalizado/API?

K = nombre de campo de la POJO y V es el valor correspondiente

public class POJO implements Serializable{ 

String name; 
String age; 
//getters and setters 
} 
+0

Es necesario para colocar la estructura de su POJO – monkjack

+0

¿Seguro que no desea que el resultado sea sólo un '' Mapa ? –

+0

Sí, o bien el resultado debería ser un 'Map ' o algo así como' List > '. Lo que ha preguntado realmente no tiene sentido –

Respuesta

6

BeanMap de Apache Commons hace el trabajo

+0

Sí. Encontré la respuesta: http://stackoverflow.com/questions/3215538/generate-mapstring-string-from-pojo – Victor

1

Puede utilizar la reflexión para hacer eso. Ver Class.getDeclaredFields. Eso le dará los campos de una clase, luego puede obtener los valores de ellos y poblar su mapa.

Tenga en cuenta que puede necesitar invocar setAccessible en los campos si son privados antes de poder obtener el valor.

Editar: Mi respuesta solo se aplica al caso en el que no conoce los campos/implementación del POJO cuando construye el mapa.

+0

Esto también funcionaría. Las principales razones para ir con una propiedad Instropector sobre la API de reflexión pura si todo lo que quiere son propiedades públicas son: - Rendimiento (BeanInfo se almacena en caché, e incluso puede escribir el suyo para personalizar los resultados) - Getters puede no reflejar su privacidad campos (o incluso campos privados) - Código más corto. –

-1

Necesita conocer el nombre POJO. Asumiendo que tiene algo así como pojo.getName(), entonces es la siguiente:

Map<String, Pojo> pojoMap = new HashMap<String, Pojo>(); 
for (Pojo pojo:pojoList) { 
    pojoMap.put(pojo.getName(), pojo); 
} 

Nota que he cambiado su requerimiento, me he convertido una lista de POJOs a un mapa.

1

Si se refiere a un mapa de K, V, entonces esto va a funcionar

List<Pojo> pojos = ...; 
Map<String, String> map = new HashMap<String,String>(); 
for (Pojo pojo : pojos) { 
map.put(pojo.getName(), pojo.getAge()); 
} 
0

Suponiendo que desea una lista Map sans, la forma más fácil es, probablemente, con un simple bucle for:

Map<K,V> theMap = new HashMap<K,V>(); 
for (POJO obj : theList) { 
    // Obviously the below can be simplified to one line 
    // but it makes sense to make everything explicit for 
    // ease of reading 
    K key = ... // obj.getName() maybe? 
    V value = ... // obj itself maybe? 
    theMap.put(key, value); 
} 
8

Suena como un trabajo para los buenos y los viejos Introspector.

Ejemplo de trabajo:

// Don't be lazy like this, do something about the exceptions 
public static void main(String[] args) throws Exception { 
    List<POJO> pojos = new ArrayList<POJO>(); 
    POJO p1 = new POJO(); 
    p1.setAge("20"); 
    p1.setName("Name"); 
    pojos.add(p1); 
    POJO p2 = new POJO(); 
    // ... 
    System.out.println(convertCollection(pojos)); 
} 

public static List<Map<String, ?>> convertCollection(Collection collection) 
     throws Exception { 
    List<Map<String, ?>> list = new ArrayList<Map<String, ?>>(); 
    for (Object element : collection) { 
     list.add(getValues(element)); 
    } 
    return list; 
} 

public static Map<String, ?> getValues(Object o) 
     throws Exception { 
    Map<String, Object> values = new HashMap<String, Object>(); 
    BeanInfo info = Introspector.getBeanInfo(o.getClass()); 
    for (PropertyDescriptor pd : info.getPropertyDescriptors()) { 
     // This will access public properties through getters 
     Method getter = pd.getReadMethod(); 
     if (getter != null) 
      values.put(pd.getName(), getter.invoke(o)); 
    } 
    return values; 
} 
Cuestiones relacionadas