此问题与com.google.common.collect.Multimap。
中的Multimap有关我有一个Multimap,是否有更简单,更方便的方法将密钥以关键字开头的条目复制到另一个临时Multimap? - 以下是我目前的解决方案。
private Multimap<String, String> copyDesiredMetadata(Multimap<String, String> metadata)
{
Multimap<String, String> returnedMap = new CaseInsensitiveKeyMultimap<>();
// Iterate through the entries in the metadata
for (Map.Entry entry : metadata.entries()) {
String key =entry.getKey().toString();
// If the entry has the field key we are looking for add to returned map.
if (key.startsWith("AAA") || key.startsWith("BBB") || key.startsWith("CCC") || key.startsWith("DDD")) {
returnedMap.put(key, entry.getValue().toString());
}
}
return returnedMap;
}
答案 0 :(得分:3)
我认为应该定义“更方便”,但这里有一个更实用的方法:
ImmutableMultimap<String, String> yourNewMap = metadata.entries()
.stream()
.filter(entry -> entry.getKey().matches("(AAA|BBB|CCC|DDD).*"))
.collect(Collector.of(ImmutableMultimap.Builder<String, String>::new,
ImmutableMultimap.Builder<String, String>::put,
(left, right) -> {
left.putAll(right.build());
return left;
},
ImmutableMultimap.Builder::build));
请注意,我使用ImmutableMultimap
代替CaseInsensitiveKeyMultimap
,因为我不了解此实现,但您应该能够轻松地进行调整。
就个人而言,我会在实用程序类中提取收集器,以便代码看起来更干净...... .collect(MoreCollectors.toCaseInsensitiveKeyMultimap())