如何创建地图,其中每个键值名称从类属性的名称推断出的列表和价值是通过getter方法来把
我有在java中下面的类
class DTA {
private String id;
private String age;
@Override
public String toString() {
return "DTA{" +
"id='" + id + '\'' +
", age='" + age + '\'' +
'}';
}
public DTA(String id, String age) {
this.id = id;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
我有类型的对象的列表DTA
List<DTA> listA = new ArrayList<>();
listA.add(new DTA("A", "15"));
listA.add(new DTA("B", "25"));
我要创造出有以下内容的地图(有点像斯卡拉)的有序列表。
List<? extends Map<String, String>>
List(Map("id"->"A", "age"->"15"), Map("id"->"B", "age"->"25"))
如果没有“动态”中,直截了当的事情可能是这样的:
List<Map<String, String>> x = listA
.stream()
.map(this::toMap)
.collect(Collectors.toList());
与本地助手,如:
private Map<String, String> toMap(DTA dta) {
Map<String, String> rv = new HashMap<>();
rv.put("id", dta.getId());
rv.put("age", dta.getAge());
return rv;
}
为了完全动态的在这里,你将不得不使用反射来查询的字段名。你可以找到例子,说明如何做到这一点在这里。
但我强烈建议不这样做:反射应该永远是你的最后一招。的概念DTA表明你有对象的数据来自一些“服务”来了呢。如果是这样,为什么第一序列化为具体的DTA班,然后是“扁平化”的信息到一些通用的地图结构?
含义:当服务给你的对象被序列化为,说JSON或XML ......那么这将是好得多简单地使用像GSON或杰克逊库来直接反序列化数据到这种通用的“扁平化”为基础的地图对象。杰克逊例如有JsonNode类。当你反序列化为这样的对象,你会得到字段名的该映射是免费的!见这里更多的示例代码。
的一点是:使用反射识别字段是可能的。但反射代码总是单调乏味,而且容易出错。如果可能,这样做,自己躲得远远的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句