2013-11-26 4 views
0

Я пытаюсь изменить значение «Объект» на объект «Список значений», чтобы один ключ мог хранить несколько значений. Найдите фрагмент кода.Convert Map <String, Object> to Map <String, List <Object>>

protected Subscriber updateSubscriberAttributes(Subscriber subscriber, Collection<SubscriberAttributeDto> subscriberAttributesCollection) 
     throws ErrorException { 
    // Do we have any custom attributes to store? 
    if ((subscriberAttributesCollection != null) && !subscriberAttributesCollection.isEmpty()) { 
     // Yes! Convert to a Map first. 
     Map<String, Object> subscriberAttributesMap = new HashMap<String, Object>(subscriberAttributesCollection.size()); 
     for (SubscriberAttributeDto subscriberAttribute : subscriberAttributesCollection) { 
      // Convert the input attribute value to a database-appropriate value 
      SubscriberAttributeMetadata attrMetadata = subscriberAttribute.getAttributeMetadata(); 
      if (attrMetadata != null) { 
       subscriberAttributesMap.put(attrMetadata.getColumnName(), 
         attrMetadata.convertToDatabaseValue((String) subscriberAttribute.getValue())); 
      } 
     } 

     // Perform the update 
     return updateSubscriberAttributes(subscriber, subscriberAttributesMap); 
    } else { 
     return subscriber; 
    } 
} 

Извините, код очень грязный. Поэтому проблема, с которой я столкнулся, заключается в следующем: если я изменю объявление subscribersAttributeMap на Map<String,List<Object>>, мне нужно изменить объявление метода и выбросить столько ошибок. Я пробовал это долгое время.

+0

Это часть рефакторинга, а также. –

+0

Спасибо за рефакторинг Luiggi .. –

ответ

1
protected Subscriber updateSubscriberAttributes(Subscriber subscriber, Collection<SubscriberAttributeDto> subscriberAttributesCollection) throws ErrorException { 
    // Do we have any custom attributes to store? 
    if ((subscriberAttributesCollection != null) && !subscriberAttributesCollection.isEmpty()) { 
     // Yes! Convert to a Map first. 
     Map<String, List<Object>> subscriberAttributesMap = new HashMap<String, List<Object>>(subscriberAttributesCollection.size()); 
     for (SubscriberAttributeDto subscriberAttribute : subscriberAttributesCollection) { 
      // Convert the input attribute value to a database-appropriate value 
      SubscriberAttributeMetadata attrMetadata = subscriberAttribute.getAttributeMetadata(); 
      if (attrMetadata != null) { 
       // 
       String columnName = attrMetadata.getColumnName(); 
       List<Object> list = subscriberAttributesMap.get(columnName); 
       if (list == null) { 
        list = new ArrayList<Object>(); 
        subscriberAttributesMap.put(columnName, list); 
       } 
       // 
       list.add(attrMetadata.convertToDatabaseValue((String) subscriberAttribute.getValue())); 
      } 
     } 

     // Perform the update 
     return updateSubscriberAttributes(subscriber, subscriberAttributesMap); 
    } else { 
     return subscriber; 
    } 
} 

protected Subscriber updateSubscriberAttributes(Subscriber subscriber, Map<String, List<Object>> map) throws ErrorException { 
    // do some logic hiere ... 
    return new Subscriber(); 
} 
1

вероятно что-то вроде:

Map<String,List<Object>>subscriberAttributesMap = new HashMap<String, List<Object>>(subscriberAttributesCollection.size()); 
       for (SubscriberAttributeDto subscriberAttribute : subscriberAttributesCollection) { 
        // Convert the input attribute value to a database-appropriate value 
        SubscriberAttributeMetadata attrMetadata = subscriberAttribute.getAttributeMetadata(); 
        if (attrMetadata != null) { 
         List<Object> lst = subscriberAttributesMap.get(attrMetadata.getColumnName()); 
         if(lst == null){ 
          lst = new ArrayList<Object>(); 
          subscriberAttributesMap.put(attrMetadata.getColumnName(), lst); 
         } 
         lst.add(attrMetadata.convertToDatabaseValue((String) subscriberAttribute.getValue())); 

        } 
       } 
+0

* Итак, проблема, с которой я столкнулся, заключается в том, что если я изменяю объявление 'subscriptionAttributeMap' на' Map > 'Мне нужно изменить объявление метода и выбросить столько ошибок * Это основная проблема. –

+0

Я не могу исправить всю свою программу, тогда :( – user1121883

+0

Модифицировать методы, которые используют эту 'Map ', является частью изменений, которые необходимо выполнить. Также факт, что 'Map ' выглядит как запах кода ... –

0

Вы можете с помощью кнопок/повторного внедрения/копирования гуавы-х Multimap, который имеет функции, необходимые и интерфейс, похожий на java.util.Map. Таким образом, это минимизирует изменения кода. Пример из их документации:

ListMultimap<String, Object> multimap = ArrayListMultimap.create(); 

for (President pres : US_PRESIDENTS_IN_ORDER) { 
    multimap.put(pres.firstName(), pres.lastName()); 
} 

for (String firstName : multimap.keySet()) { 
    List<Object> lastNames = multimap.get(firstName); 
    out.println(firstName + ": " + lastNames); 
} 

Multimap может быть преобразован обратно к Map:

// java.util.Map representation 
Map<String,Collection<Object>> stringCollectionMap = multimap.asMap(); 
Смежные вопросы