当前位置: 首页 > 知识库问答 >
问题:

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

微生俊材
2023-03-14

我正在开发Spring启动应用程序,有两个对象,一个是自定义类列表,另一个是字符串键和字符串值的映射。例如。

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的前两个对象具有重复值

然后我有地图<code>地图

{
    lookupval1= {fieldA:"lookupval1",fieldD:"xxx",.............},
    lookupval2= {fieldA:"lookupval2",fieldD:"yyy",.............}.
    .
    .
    .
}

我想要的是,我想将列表中的每一项的字段与map中的字段相结合,我可以通过获取fieldA的查找值在Map中找到相应的键。

字段a:查找值1

然后我想把响应发送给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 object

Map<String,Map<String,String> mapCollection
    = getMapCollection(); // return String, Map<String,String> pairs
  • mapCollection中的here键始终等于DTO的id,并且DTO列表将具有重复的值

我已经发布了答案,我已经这样做了,但寻找更好的替代方案来减少计算。

共有2个答案

公良育
2023-03-14

假设

假设您的初始对象是项目类型,如下所述。

class Item {
    String fieldA,fieldB,fieldC;

    // Getters / Setter
}

假设< code>Item的初始列表称为< code>items

假设您的初始映射称为 map,并且类型为 Map

解决办法

向Item类添加方法以返回<code>Map

public Map<String, String> toMap() {
    return new HashMap<String, String>() {{
        put("fieldA", fieldA);
        put("fieldB", fieldB);
        put("fieldC", fieldC);
    }};
}

创建一个方法来获取给定字段的字段 D 值 A 值

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

然后您可以使用正确的field dD值为每个对象生成映射列表

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-14
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"
    }     
 ]
 类似资料:
  • 问题内容: 我需要能够在运行时合并两个(非常简单的)JavaScript对象。例如,我想: 有没有人为此提供脚本或知道内置的方式来执行此操作?我不需要递归,也不需要合并函数,只需合并平面对象上的方法即可。 问题答案: ECMAScript 2018标准方法 您将使用对象传播: 现在是和的并集。中的属性将覆盖中的属性。 这也是此语法的MDN文档。如果您正在使用babel,则需要babel-plugi

  • 我想要一个方法,它返回一个Object,该Object被赋予一个类,该类取决于传递的String的值 然后,我希望能够打印出一个属性(例如对象属性),我知道它将由类名可以表示的所有可能的类持有。可能的类在单独的文件中定义。但是编译器给错误找不到符号对象属性。我如何访问这个对象的属性? 抱歉,问题措辞不当 感谢您的任何帮助

  • 到目前为止,我已经学会了: 1) 对于循环,我可以使用它来迭代对象中的索引,例如具有数字索引键的数组。 2) 的中,循环为我提供了iterable和custom属性以及继承属性。但是,它忽略了值未定义的属性。 对于例如。 将省略索引,因为它的值是。 但是,它将迭代,和。 3) 的对值而不是键进行迭代。不同之处在于,它只迭代所有iterable属性,忽略了自定义属性,也忽略了从原型链继承的属性。但是

  • 我正在尝试使用DynamoDB JavaScript shell创建一个简单的表,我得到了这个异常: 下面是我试图创建的表: 但是,如果我将第二个属性添加到KeySchema,它就可以正常工作。a工作台下方: 我不想将范围添加到密钥架构。知道怎么修吗?

  • 问题内容: 我有两个或多个JavaScript对象。我想合并它们,添加共同属性的值,然后按值的降序对其进行排序。 例如 然后应该是这样的: 即,两个对象都合并,添加共同键的值,然后对键进行排序。 这是我尝试过的: 但我认为它没有好处。如此多的循环:(如果有人可以提供更少混乱且良好的代码,那就太好了。 问题答案: 无法对对象的属性进行排序,但是可以对数组进行排序:

  • 问题内容: 我有一个包含许多对象的ArrayList。我想对相同属性名称的值进行求和。 示例数据为 ProfitAndLossDataDO的* 对象 * 结果将是(人相同时的值总和)- 逻辑类 ProfitAndLossDataDO 谢谢 问题答案: 我会遍历列表并将结果收集在地图中: 编辑: Java 8对接口的增强使我们能够以一种稍微更优雅的方式来实现此方法,中间是令人讨厌的代码块: