Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从键值对构建映射_Java_Collections_Map_Guava - Fatal编程技术网

在Java中从键值对构建映射

在Java中从键值对构建映射,java,collections,map,guava,Java,Collections,Map,Guava,可能重复: 是否有任何实用程序类允许以方便且可读的方式从多个键值对创建映射 我以为guava应该包含一些东西,但我找不到任何具有必要功能的东西 我想要的是这样的东西: MapBuilder.newHashMap() .with("key1", 10) .with("key2", 20) .with("key3", 30) .build(); 另外,我也知道双括号方法(newhashmap(){{{put(..);put(..;}}}),但我觉得它既不可读也不方便。来自head

可能重复:

是否有任何实用程序类允许以方便且可读的方式从多个键值对创建映射

我以为
guava
应该包含一些东西,但我找不到任何具有必要功能的东西

我想要的是这样的东西:

MapBuilder.newHashMap()
  .with("key1", 10)
  .with("key2", 20)
  .with("key3", 30)
  .build();
另外,我也知道双括号方法(
newhashmap(){{{put(..);put(..;}}}
),但我觉得它既不可读也不方便。

来自head,未经测试:

import java.util.HashMap;

public class MapBuilder<K, E> {
    private HashMap<K, E>       m_hashMap;

    public static HashMap newHashMap(Class<K> keyClass, Class<E> elementClass) {
        return new MapBuilder<K, E>();
    }

    public MapBuilder() {
        m_hashMap = new HashMap<K, E>();
    }

    public MapBuilder with(K key, E element) {
        m_hashMap.put(key, element);

        return this;
    }

    public HashMap<K, E> build() {
        return m_hashMap;
    }
}
import java.util.HashMap;
公共类映射生成器{
私有HashMap m_HashMap;
公共静态HashMap newHashMap(类keyClass、类elementClass){
返回新的MapBuilder();
}
公共地图生成器(){
m_hashMap=新hashMap();
}
带有(K键,E元素)的公共地图生成器{
m_hashMap.put(键,元素);
归还这个;
}
公共HashMap build(){
返回m_hashMap;
}
}
用法:

HashMap<String, Integer> myMap = MapBuilder.newHashMap(String.class, Integer.class)
    .with("key1", 10)
    .with("key2", 20)
    .with("key3", 30)
    .build();
HashMap myMap=MapBuilder.newHashMap(String.class,Integer.class)
.带(“键1”,10)
.带(“键2”,20)
.带(“键3”,30)
.build();
你怎么了

Map<String, Integer> map = new HashMap<>();
map.put("key1", 10);
map.put("key2", 20);
map.put("key3", 30);
Map Map=newhashmap();
地图放置(“键1”,10);
地图放置(“键2”,20);
地图放置(“键3”,30);

对我来说,这看起来非常可读,我不知道你从地图生成器中获得了什么。无论如何,这样的地图构建器并不难实现。

为什么不自己动手呢

public class MapBuilder<K,V> {

    private Map<K,V> map;

    public static <K,V> MapBuilder<K,V> newHashMap(){
            return new MapBuilder<K,V>(new HashMap<K,V>());
    }

    public MapBuilder(Map<K,V> map) {
        this.map = map;
    }

    public MapBuilder<K,V> with(K key, V value){
        map.put(key, value);
        return this;
    }

    public Map<K,V> build(){
        return map;
    }

}
公共类映射生成器{
私人地图;
公共静态映射生成器newHashMap(){
返回新的MapBuilder(newhashmap());
}
公共地图生成器(地图){
this.map=map;
}
具有(K键,V值)的公共地图生成器{
map.put(键、值);
归还这个;
}
公共地图构建(){
返回图;
}
}

用返回this的put方法创建自己的
抽象映射如何

public class MyMap<K, V> extends AbstractMap<K, V>{

    @Override
    public Set<java.util.Map.Entry<K, V>> entrySet() {
        // return set
        return null;
    }

    public MyMap<K, V> puts(K key, V value) {
        this.put(key, value);
        return this;
    };

}
公共类MyMap扩展了AbstractMap{
@凌驾
公共集入口集(){
//返回集
返回null;
}
公共MyMap puts(K键,V值){
这个.put(键、值);
归还这个;
};
}
然后使用该方法来链对:

new MyMap<String, String>()
            .puts("foo", "bar")
            .puts("Hello", "World");
newmymap()
.puts(“foo”、“bar”)
.puts(“你好”,“世界”);

同意,非常可读。同意,易于实施。(我希望我建议的实现中没有bug哈哈)不需要类参数。关于更好的实现,请参见Robert的答案。我看到了它,并询问了它。据我所知,如果不分配它,就无法创建它?这不是人们经常想做的事情,但仍然:)@Roman关于双大括号方法-这是匿名类定义,您正在初始化块(第二对大括号)中调用put()。我不喜欢这种方法,因为它通常会生成关于缺少serialVersionUID的警告,并且您需要@SupersWarnings(“serial”)。请参阅。对于像这样的小地图,也可以看到更方便的。上面的链接已断开。新链接:,
K
V
如何为静态方法
newHashMap()
所知?是不是就在
static
之后的
意味着它将从赋值运算符的左侧获取?它是一个通用方法,也是一个通用类我知道它是一个通用方法。关于类型从何处派生的信息正确吗?这些类型是在调用方法MapBuilder.newHashMap()时给出的。如果声明MapBuilder变量,则可以从生成器的类型推断该变量:MapBuilder b=MapBuilder.newHashMap();