当前位置: 首页>>编程语言>>正文


用于Java的asMap-implementation(基于Arrays.asList)

苏灿 编程语言 去评论

问题描述

我总是厌倦Java中非常详细的语法来创建小Map。 Arrays.asList(T... a)非常方便,因此我想要一个类似于Map的东西。

public class MapUtils {
    public static <K, V> MapBuilder<K, V> asMap(K key, V value) {
        return new MapBuilder<K, V>().entry(key, value);
    }

    public static class MapBuilder<K, V> extends HashMap<K, V> {
        public MapBuilder<K, V> entry(K key, V value) {
            this.put(key, value);
            return this;
        }
    }
}

/* Example of how to use asMap */
public class Example {
    public void example() {
        Map<String, String> map = MapUtil.asMap("key", "value").entry("key2", "value2");
    }
}

/* Example of how the one way to create an inline Map in Java */
public class Before {
    public void before() {
        Map<String, String> map = new HashMap<String, String>() {{
            put("key", value");
            put("key2", value2");
        }};
    }
} 

任何关于如何改进MapUtils实现的输入?你认为asMap功能是一个好主意,还是我懒得写一些额外的字符?

最佳解决办法

在我看来,MapBuilder应该包含一个Map,不能扩展一个。另一个可能的设计是使用一个单一的调用与varargs:

public class MapUtil {
    public static <K,V> Map<K,V> asMap(Map.Entry<K,V>... entries) {
        Map<K,V> map = new HashMap<K,V>();
        for(Map.Entry<K,V> entry : entries) {
            map.put(entry.getKey(), entry.getValue());
        }
        return map;
    }

    public static <K,V> Map.Entry<K,V> e(final K k, final V v) {
        return new Map.Entry<K, V>() {
            public K getKey() {
                return k;
            }
            public V getValue() {
                return v;
            }
            public V setValue(V value) {
                throw new UnsupportedOperationException("Not supported");
            }
        };
    }
} 

import static very.useful.MapUtil.*;
... 
Map<String, Integer> map = asMap(e("x",1),e("y",2),e("z",3));

次佳解决办法

google-collections有关于它,例如ImmutableMap.of()。此外,他们教导使用正确的数据结构,如真正的不可变的集合,有序列表等。我非常喜欢它。


Google Collections现已成为Google Guava的一部分,其中包括ImmutableMap.Builder。你可以做到这一点:

   static final ImmutableMap<String, Integer> WORD_TO_INT =
   new ImmutableMap.Builder<String, Integer>()
       .put("one", 1)
       .put("two", 2)
       .put("three", 3)
       .build();

您可以根据需要多次调用put(K, V)方法。建筑商对于这种情况非常好。

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/192133.html,未经允许,请勿转载。
Go