【发布时间】:2016-02-28 10:26:07
【问题描述】:
使用 Java 8 执行以下代码的任何方式。
final Map<String, Collection<ProductStrAttributeOverrideRulesModel>> attributeRulesMap = new HashMap<String, Collection<ProductStrAttributeOverrideRulesModel>>();
for (final ProductStrAttributeOverrideRulesModel rule : rules)
{
final String key = rule.getProductStrAttributeOverride().getProductStrTypeField().getAttributeDescriptorQualifier();
if (attributeRulesMap.containsKey(key))
{
final Collection<ProductStrAttributeOverrideRulesModel> currentRules = attributeRulesMap.get(key);
currentRules.add(rule);
}
else
{
final Collection<ProductStrAttributeOverrideRulesModel> list = new LinkedList<ProductStrAttributeOverrideRulesModel>();
list.add(rule);
attributeRulesMap.put(key, list);
}
}
如果只是
final Map<String, ProductStrAttributeOverrideRulesModel> attributeRulesMap
我可以像下面那样做,但我需要根据键将整个集合安排在地图中,并且每个键可以有多个值存储在集合中。
Map<String, ProductStrAttributeOverrideRulesModel> result =
choices.stream().collect(Collectors.toMap(ProductStrAttributeOverrideRulesModel::getProductStrAttributeOverride.getProductStrTypeField.getAttributeDescriptorQualifier,
Function.identity()));
【问题讨论】:
-
对于 Java 8 之前的代码,这有点反模式。当您可以简单地使用一个时,您使用两个映射查找(
containsKey和get)。这使得代码可能会慢很多。 -
你提到了一个很好的观点鲍里斯。非常感谢。
-
@BoristheSpider 如果有一对
("something", null),containsKey("something")将返回true,但get("something")将返回null- 结果与根本没有这样的密钥相同. -
@JaroslawPawlak 我知道
Map是如何工作的。在这种情况下,逻辑是相同的,因此不需要 - 这是浪费 CPU 周期。 -
@Jaroslaw Pawlak:很明显,如果根据@987654333 将映射到
null的当前映射视为“当前”,这将 有帮助@,当Collection预计将无条件添加一个元素时。真正需要尊重到null的映射的情况很少见,即便如此,说value=map.get(key); if(value==null && !map.containsKey(key)) …更有效。
标签: java dictionary collections java-8