【问题标题】:Convert Map<String, Object> to Map<String, List<Object>>将 Map<String, Object> 转换为 Map<String, List<Object>>
【发布时间】:2013-11-26 15:13:40
【问题描述】:

我正在尝试将 Map 值对象更改为 List 值对象,以便单个键可以存储多个值。请找到代码sn-p。

  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&lt;String,List&lt;Object&gt;&gt; 我必须更改方法声明并抛出这么多错误。我确实尝试了很久。

【问题讨论】:

  • 这也是重构的一部分。
  • 感谢重构 Luiggi..

标签: java list map


【解决方案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();
}

【讨论】:

    【解决方案2】:

    大概是这样的:

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

    【讨论】:

    • 所以我在这里面临的麻烦是,如果我将 subscribersAttributeMap 的声明更改为 Map&lt;String,List&lt;Object&gt;&gt; 我必须更改方法声明并抛出这么多错误这是主要问题。
    • 我无法修复他的整个程序 :(
    • 修改使用此Map&lt;Key, Value&gt; 的方法也是要完成的更改的一部分。此外,拥有Map&lt;Key, Object&gt; 的事实看起来像代码气味......
    【解决方案3】:

    您可能想要使用/重新实现/复制 Guava 的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();
    

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2013-05-24
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多