问题 将POJO转换为地图[重复]


可能重复:
如何将Java对象(bean)转换为键值对(反之亦然)? 

转换a的最佳方法是什么? List<POJO> to a List<Map<K,V>>. 有自定义方法/ API吗?

K = POJO的字段名称,V是对应的值

public class POJO implements Serializable{

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

4232
2018-05-20 17:11


起源

你需要发布你的pojo的结构 - monkjack
你确定你不希望结果只是一个 Map<K,V>? - Adam Batkin
是的,结果应该是a Map<K,V> 或类似的东西 List<Map.Entry<K, V>>。你问的问题真的没有意义 - Java Drinker
地图对象列表不是可以直观理解的数据结构。像你所展示的POJO列表对我来说感觉更清洁.. - stratwine


答案:


BeanMap 来自Apache Commons的工作


6
2018-05-20 17:22



是。我找到了答案: stackoverflow.com/questions/3215538/... - Victor


对于好人和老人来说,这听起来像是一份工作 内部检查

工作范例:

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

8
2018-05-20 18:00





你可以使用反射来做到这一点。看到 Class.getDeclaredFields。这将为您提供类的字段,然后您可以从中获取值并填充您的地图。

请注意,您可能需要调用 setAccessible 在字段上如果是私有的,则可以获得该值。

编辑:我的回答仅适用于您在构建地图时不知道POJO的字段/实现的情况。


1
2018-05-20 17:18



这也行得通。如果你想要的只是公共属性,使用属性Instropector而不是纯反射API的主要原因是: - 性能(BeanInfo得到缓存,你甚至可以编写自己的自定义结果) - Getters可能无法反映他们的私有字段(甚至有私人领域) - 更短的代码。 - Anthony Accioly


如果你的意思是K,V的地图,那么这将有效

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

1
2018-05-20 17:19





假设你想要一个 Map 没有列表,最简单的方法可能是使用简单的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);
}

0
2018-05-20 17:20





您需要知道POJO名称。假设你有类似的东西 pojo.getName(),那就是这样的:

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

注意 我已经改变了你的要求 转换 一张地图的pojos列表。


-1
2018-05-20 17:18