将条目从一个Multimap复制到另一个Multimap

时间:2016-12-10 00:53:27

标签: java loops java-8

此问题与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;
}

1 个答案:

答案 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())