为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 中合并两个对象的属性?(用户定义类的属性和映射的键值)

如何在 Java 中合并两个对象的属性?(用户定义类的属性和映射的键值)

撒科打诨 2023-03-02 15:20:42
我正在开发 spring boot 应用程序并且有两个对象,一个是自定义类的列表,另一个是字符串键和字符串值的映射。前任。DTO object with fixed fields fieldA,fieldB,fieldc. [{"fieldA": "lookupval1","fieldB": "val2","fieldc":"val3"},{"fieldA": "lookupval1","fieldB": "val5","fieldc":"val6"}{"fieldA": "lookupval2","fieldB": "val8","fieldc":"val9"}]另外请注意,此字段 A 的前两个对象具有重复值然后我有Map<String,Map<String,String>如下图的地图{    lookupval1= {fieldA:"lookupval1",fieldD:"xxx",.............},    lookupval2= {fieldA:"lookupval2",fieldD:"yyy",.............}.    .    .    .}我想要的是,我想将列表中的每一项中的字段与Map中的字段组合起来,我可以通过获取fieldA的查找值在map中找到相应的键。字段A:lookupval1然后我想将该响应发送到 REST 客户端,执行此操作的有效方法和数据结构是什么?预期结果:[{"fieldA": "lookupval1","fieldB": "val2","fieldc":"val3",fieldD:"xxx"},{"fieldA": "lookupval1","fieldB": "val2","fieldc":"val3",fieldD:"xxx"}{"fieldA": "lookupval2","fieldB": "val8","fieldc":"val9",fieldD:"yyy"}]]更新:下面是 DTO 对象的结构和 Map 的确切类型。class DTO {    int id;    String name;    String desc;}List<DTO> dtoList = getDTOList(); // returns list of DTO objectMap<String,Map<String,String> mapCollection    = getMapCollection(); // return String, Map<String,String> pairs此处 mapCollection 中的键始终等于 DTO 的 id,并且 DTO 列表将具有重复值。我已经按照我的方式发布了答案,但正在寻找更好的替代方法来减少计算量。
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

List<DTO> dtoList = getDTOList(); // returns list of DTO object


Map<String,Map<String,String> mapCollection

    = getMapCollection(); // return String, Map<String,String> pairs

List<Map<String,String>> result =  new HashMap<>();


// iterate over dto list

for(DTO singleDTO : dtoList) {

    Map<String,String> singleResult = new HashMap<>();


    // Add all fields in map

    singleResult.put("id",singleDTO.getId());

    singleResult.put("name",singleDTO.getName());

    singleResult.put("desc",singleDTO.getDesc());


    // fetch single map by id lookup

    Map<String,Strig> singleMap = mapCollection.get(singleDTO.getId());

    // fetch all entries from map

    Set<Map.Entry<String,String>> entrySet = singleMap.entrySet();

   // add them in hashmap

    for(Map.Entry<String,String> singleEntry : entrySet) {

        singleResult.put(singleEntry.getKey(),singleEntry.getValue());


    Add map in the list

    result.add(singleEntry);

}}


//result


 [

    {

        "id":"1", "name":"abc", "desc":"some desc abc", "ID":"1", "mapField1":"field1 value",  "mapField2":"field1 value"

    },

    {

        "id":"1", "name":"xyz", "desc":"some desc xyz", "ID":"1", "mapField1":"field1 value",  "mapField2":"field1 value"

    },

    {

        "id":"2", "name":"pqr", "desc":"some desc pqr", "ID":"2", "mapField1":"field1 value 2",  "mapField2":"field1 value2"

    }     

 ]


查看完整回答
反对 回复 2023-03-02
?
慕慕森

TA贡献1856条经验 获得超17个赞

假设


假设您的初始对象的类型Item如下所述。


class Item {

    String fieldA,fieldB,fieldC;


    // Getters / Setter

}

假设您的初始列表Item被称为items


假设您的初始地图被调用map并且是类型Map<String, Map<String,String>>


解决方案


向 Item 类添加一个方法以返回Map<String, String>对象的表示


public Map<String, String> toMap() {

    return new HashMap<String, String>() {{

        put("fieldA", fieldA);

        put("fieldB", fieldB);

        put("fieldC", fieldC);

    }};

}

创建一个方法来获取fieldD给定fieldA值的值


private String getFieldDValueForFieldAValue(String fieldAValue) {

    return map.get(fieldAValue).get("fieldD");

}

创建一种方法以将正确的fieldD值添加到项映射


private Map<String, String> addFieldD(Map<String, String> itemMap) {

    itemMap.put("fieldD", getFieldDValueForFieldAValue(itemMap.get("fieldA")));

    return itemMap;

}

fieldD然后您可以为每个具有正确值的对象生成一个映射列表


List<Map<String, String>> list = items.stream()

    .map(Item::toMap) // Converts all Items to Maps

    .map(m -> addFieldD(m)) // Adds the correct fieldD value to each Map

    .collect(Collectors.toList()); // make it a List

最后用它制作一个 JSON 字符串:


Type listType = new TypeToken<List<Map<String, String>>>() {}.getType();

Gson gson = new Gson();

String json = gson.toJson(list, listType);

System.out.println(json);

这将输出以下 JSON:


[

  {"fieldA":"lookupval1","fieldC":"val3","fieldB":"val2","fieldD":"xxx"},

  {"fieldA":"lookupval1","fieldC":"val6","fieldB":"val5","fieldD":"xxx"},

  {"fieldA":"lookupval2","fieldC":"val9","fieldB":"val8","fieldD":"yyy"}

]


查看完整回答
反对 回复 2023-03-02
  • 2 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信