Как объединить свойства двух объектов в Java?(свойства определяемого пользователем класса и значения ключей Map) - PullRequest
0 голосов
/ 03 июля 2019

Я работаю над приложением весенней загрузки, и у меня есть два объекта: один, если список пользовательских классов, а другой - это Map of String keys и String values. Ex.

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.

поле 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 и точный тип карты.

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 всегда равен id списка DTO и DTO будет иметь повторяющиеся значения.

Я отправил ответ так, как я это сделал, но ищу более подходящие альтернативы для сокращения вычислений.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019
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"
    }     
 ]
0 голосов
/ 05 июля 2019

Допущения

Предполагается, что ваши начальные объекты имеют тип 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"}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...