どのように各キーの名前はクラス属性の名前から推測されたマップのリストを作成し、その値はゲッターの方法で置くことがすることです
私は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"));
私は、コンテンツを以下ました(ややScalaのような)マップの順序付きリストを作成したいです。
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のクラスを。あなたは、このようなオブジェクトにデシリアライズするとき、あなたは自由のためのフィールド名のマッピングを取得します!参照してくださいここでより多くのサンプルコードを。
点がある:リフレクションを使用してフィールドを識別することが可能です。しかし、反射コードは常に起こりやすい面倒、およびエラーです。可能な場合は、自分でやってから離れて。