Java:像C#这样的通用键值

Java: Generic keyvalue like C#

我现在在Java中寻找一种方法来做一些类似C++的事情。例如,在ASP MVC中,您可以编写:

1
DoMethod(new {key = value, another = value2});

在Java中有什么好的方法吗?我只试过一个数组:new object[] {value, value...}。不过,这样我就不能只得到键值。

我知道你能做到:

1
2
3
4
HashMap<String, object> map = new HashMap();
map.put("key","value");
map.put("anoter","value2");
DoMethod(map);

不幸的是,如果你需要经常这样做,那是一种很麻烦的方式。

干杯!


不要再改造轮子。如果您可以自由使用第三方libs,您可以尝试Google guava,它提供了没有静态初始值设定项和子类的强类型方法、代理Entry/Pair类或可能看起来不安全的变量参数:

使用生成器模式:

1
2
3
4
5
final Map<String, Object> map = new ImmutableMap.Builder<String, Object>()
       .put("key","value")
       .put("anoter","value2")
       .build();
DoMethod(map);

或者,如果条目数达到5,甚至是更短的方法(请参见重载,为什么所有这些map-factory方法都是类型安全的):

1
2
final Map<String, Object> map = ImmutableMap.<String, Object>of("key","value","anoter""value2");
DoMethod(map);


尝试:

4

阐述:

  • outer {}块表示该实例是一个匿名类,扩展了HashMap
  • 内部{}块表示复制到匿名类的构造函数的代码。


    一个简单的解决方案是使用一对参数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static <K, V> Map<K, V> newMap(K key, V value, Object... keysAndValues) {
        Map<K, V> temp = new LinkedHashMap<K, V>();
        temp.put(key, value);
        for (int i = 0; i < keysAndValues.length; i+=2)
            temp.put((K) keysAndValues[i], (V) keysAndValues[i+1]);
        return temp;
    }

    Map<String, Integer> map = newMap("Key1", 1,"Key2", 2);


    你不能直接用Java做这种事情,但是你可以用VARARGS和EDCOX1的0个类来模拟它。首先创建一个Pair类,如下所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Pair<T, U> {

        public static <T, U> Pair<T, U> of(T t, U u) {
            return new Pair<T, U>(t, u);
        }

        private final T t;
        private final U u;

        private Pair(T t, U u) {
            this.t = t; this.u = u;
        }

        public T first() { return t; }

        public U second() { return u; }
    }

    然后可以使用varargs编写方法:

    1
    2
    3
    4
    5
    6
    7
    static <K, V> Map<K, V> initialiseMap(Pair<K, V>... entries) {
        Map<K, V> temp = new HashMap<K, V>();
        for (Pair<K, V> pair : entries) {
            temp.put(pair.first(), pair.second());
        }
        return temp;
    }

    例如,您可以通过编写来初始化Map

    2


    Java本身没有任何类似的东西。不过,您可能可以在其他JVM语言中找到这些特性。如果您有选择的自由,并且您喜欢动态类型和相关特性,同时保留类似Java的语法,请检查Groovy。