【问题标题】:Convert a POJO to a <K,V> map [duplicate]将 POJO 转换为 <K,V> 映射 [重复]
【发布时间】:2011-05-20 17:11:38
【问题描述】:

可能重复:
How to convert a Java object (bean) to key-value pairs (and vice versa)?

转换List&lt;POJO&gt; to a List&lt;Map&lt;K,V&gt;&gt;. 的最佳方法是什么 是否有自定义方法/ API?

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

public class POJO implements Serializable{

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

【问题讨论】:

  • 你需要发布你的pojo的结构
  • 您确定不希望结果只是Map&lt;K,V&gt;
  • 是的,结果应该是Map&lt;K,V&gt; 或类似List&lt;Map.Entry&lt;K, V&gt;&gt; 的东西。你问的没有道理
  • 地图对象列表不是可以直观理解的数据结构。像你展示的那样的 POJO 列表,对我来说感觉更干净..

标签: java map pojo


【解决方案1】:

听起来像是一份老少皆宜的工作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;
}

【讨论】:

    【解决方案2】:

    来自 Apache Commons 的BeanMap 完成了这项工作

    【讨论】:

    【解决方案3】:

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

    请注意,如果字段是私有的,您可能需要在字段上调用 ​​setAccessible,然后才能获取值。

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

    【讨论】:

    • 这也可以。如果您想要的只是公共属性,那么使用属性 Instropector 而不是纯反射 API 的主要原因是: - 性能(BeanInfo 被缓存,您甚至可以编写自己的代码来自定义结果) - Getter 可能不会反映它们的私有字段(甚至有私有字段) - 更短的代码。
    【解决方案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 无列表,最简单的方法可能是使用简单的 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);
      }
      

      【讨论】:

        【解决方案6】:

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

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

        注意,我更改了您的要求,我已一个 pojo 列表转换为一张地图。

        【讨论】:

          猜你喜欢
          • 2018-11-23
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-16
          • 2019-01-23
          • 2017-03-22
          • 2023-02-02
          相关资源
          最近更新 更多