2013-11-26 106 views
0

我試圖將地圖值對象更改爲列表值對象,以便單個關鍵點可以存儲多個值。請找到代碼片段。將地圖<字符串,對象>轉換爲地圖<字符串,列表<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

*所以我在這裏面臨的麻煩是,如果我更改'subscribersAttributeMap'到'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(); 
相關問題