从Java 7中的Set <map.entry>构造Map?</map.entry>

时间:2014-02-11 15:41:33

标签: java

java.util.Map附带entrySet()方法......

  

返回此映射中包含的映射的Set视图。

是否有单个方法调用或一系列API调用使用Java 7 API重新构建集合的集合,标记为我需要在此处放置什么?在以下代码示例中?

package so;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class SetMapExample {
    public static void main(String[] args) {
        Map<String, String> m = new HashMap<String, String>();
        m.put("k1", "v1");
        m.put("k2", "v2");
        Set<Map.Entry<String, String>> s = m.entrySet();
        Map<String, String> ms = s...   // what do I need to put here?
    }
}

如果可能的话,我不想使用for循环,并希望在entrySet上使用与Map类似的方法,但我似乎无法找到一个。

4 个答案:

答案 0 :(得分:2)

Apache Commons Collections提供了MapUtils.putAll,它可以做你想要的,但是在你想要避免的for循环逻辑的掩护下,你也可以自己做循环...

一般情况下,无法在Map个条目中构造Set,这些条目不需要您(或您正在调用的库函数)至少迭代一次条目 - 可能有特殊情况,例如如果你有一个你知道按键排序的条目列表,那么你可以编写一个只读的地图实现,它使用二进制搜索来找到密钥。

答案 1 :(得分:1)

Set幕后使用Map,而Set中的实际上是Map中的键。因此,如果没有for循环,就无法实现您想要/需要的东西。使用普通Java(没有其他花哨的框架),你只能这样做:

for(Map.Entry<String,String> entry : s) {
    ms.put(entry.getKey(), entry.getValue());
}

答案 2 :(得分:0)

JDK不提供此类方法,但您可以根据需要使用Guava。提示:使用TransofrmersMaps。你必须编写自己的“变换器” - 番石榴Function的单行实现。如果将其实现为通用顶级类,则可以在以后重新使用它。

答案 3 :(得分:0)

java.util.Map#entrySet()是关于添加元素的单视图操作,接受Set<Map.Entry<K, V>>的构造函数似乎是一个非常具体且很少发生的情况。