Java 更好的映射构造函数

Java 更好的映射构造函数,java,collections,map,Java,Collections,Map,有没有更精简的方法来执行以下操作 Map<String, String> map = new HashMap<String, String>(); map.put("a", "apple"); map.put("b", "bear"); map.put("c", "cat"); Map Map=newhashmap(); 放在地图上(“a”,“苹果”); 地图放置(“b”、“熊”); 地图放置(“c”、“cat”); 我在找更接近这个的东西 Map<Strin

有没有更精简的方法来执行以下操作

Map<String, String> map = new HashMap<String, String>();
map.put("a", "apple");
map.put("b", "bear");
map.put("c", "cat");
Map Map=newhashmap();
放在地图上(“a”,“苹果”);
地图放置(“b”、“熊”);
地图放置(“c”、“cat”);
我在找更接近这个的东西

 Map<String, String> map = MapBuilder.build("a", "apple", "b", "bear", "c", "cat");
Map-Map=MapBuilder.build(“a”、“苹果”、“b”、“熊”、“c”、“猫”);
总是有:

Map Map=newhashmap(){{
放(苹果);放(熊);放(猫);

这种方法存在一些问题。它返回一个扩展HashMap的匿名内部类,而不是HashMap。如果您需要序列化地图,那么请知道。

您可以使用Google collections library。

不,没有,但我写了一个方法来实现这一点,灵感来自Objective-C NSDictionary类:

public static Map<String, Object> mapWithKeysAndObjects(Object... objects) {

    if (objects.length % 2 != 0) {
        throw new IllegalArgumentException(
                "The array has to be of an even size - size is "
                        + objects.length);
    }

    Map<String, Object> values = new HashMap<String, Object>();

    for (int x = 0; x < objects.length; x+=2) {
      values.put((String) objects[x], objects[x + 1]);
    }

    return values;

}
公共静态映射WithKeysandObjects(对象…对象){
如果(objects.length%2!=0){
抛出新的IllegalArgumentException(
“数组的大小必须为偶数-大小为”
+对象(长度);
}
映射值=新的HashMap();
对于(int x=0;x
您可以始终使用双大括号初始化:

Map Map=newhashmap(){{
put(“foo”、“bar”);
put(“baz”、“qux”);
}}

但请记住,根据Java 9添加的
Map.of,这可能是无效的,例如:

Map<String, String> map = Map.of("a", "apple", "b", "bear", "c", "cat");
Map Map=Map.of(“a”、“苹果”、“b”、“熊”、“c”、“猫”);
最多支持10个条目。有关更多条目,您可以使用重载获取条目:

Map<String, String> map 
    = Map.ofEntries
        (Map.entry("a", "apple")
        , Map.entry("b", "bear")
        , Map.entry("c", "cat"));
地图
=入口地图
(地图条目(“a”、“苹果”)
,地图条目(“b”,“熊”)
,地图条目(“c”、“cat”);

请注意,这些方法不返回HashMap。它返回一个优化的不可变映射。

最有可能的警告是,该映射将不可序列化。+1。有趣的是,我以前没见过。问题是它是否真的让生活变得更简单:-)对于任何类型的生产代码来说,这通常都不是一个好主意。每次它都会创建匿名类。@乔治:不是因为它不可序列化,而是编译器警告说它没有serialUID。@Nathan,我不知道你可以序列化匿名子类,但即使这样,我也不推荐。这破坏了Java泛型的类型安全性。我不明白你为什么要在google的集合中重新设计ImmutableMap.of(…),我会重新设计,以避免在我只需要一个方法的情况下添加另一个充满不必要类的不必要库。好主意@Robert,现在添加了它。Guava是臃肿的v18添加了2.5MB jar文件(没有源代码),如果要使用1%,我宁愿使用像这样的自定义解决方案来加快编译/部署时间。键/值是这样硬编码的吗?如果是这样的话,为什么不加载json字符串之类的东西呢?@David:这对于常量来说是一个很好的选择。特别是对我来说,因为我经常使用JSON,并且经常有可用的方法。任何想到“双括号初始化”这个名字的人都应该被枪毙。这是与非静态初始值设定项块组合的匿名类的有效声明。
Map<String, String> map = Map.of("a", "apple", "b", "bear", "c", "cat");
Map<String, String> map 
    = Map.ofEntries
        (Map.entry("a", "apple")
        , Map.entry("b", "bear")
        , Map.entry("c", "cat"));