Преобразование POJO в карту <K, V>

Возможный дубликат:
Как преобразовать объект Java (bean) в пары ключ-значение (и наоборот)?

Каков наилучший способ преобразования List<POJO> to a List<Map<K,V>>. Есть ли специальный метод /API?

K = имя поля POJO, а V - соответствующее значение

public class POJO implements Serializable{

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

Ответ 1

BeanMap от Apache Commons выполняет работу

Ответ 2

Звучит как работа для хорошего и старого Introspector.

Рабочий пример:

// 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;
}

Ответ 3

Вы можете использовать отражение, чтобы сделать это. См. Class.getDeclaredFields. Это даст вам поля класса, вы сможете получить от них значения и заполнить карту.

Обратите внимание, что вам может потребоваться вызвать setAccessible в полях, если они являются частными, прежде чем вы сможете получить значение.

Изменить: Мой ответ относится только к случаю, когда вы не знаете полей/реализации POJO при создании карты.

Ответ 4

Если вы имеете в виду карту K, V, то это будет работать

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

Ответ 5

Предполагая, что вам нужен список Map sans, самый простой способ - это, вероятно, простой цикл:

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);
}

Ответ 6

Вам нужно знать имя POJO. Предполагая, что у вас есть что-то вроде pojo.getName(), тогда он выглядит примерно так:

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

Обратите внимание, что я изменил ваше требование, я преобразовал один список pojos в одну карту.