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

时间:2014-12-14 16:23:58

标签: java c# arrays hashmap

我目前正在寻找一种方法来做一些像c#这样的事情。例如,在ASP MVC中,您可以编写:

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

在java中有没有很好的方法呢?我尝试过一个数组:new object[] {value, value...} 然而,这样我就无法获得钥匙的价值。

我知道你可以这样做:

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

不幸的是,如果你需要做很多事情,这是一种麻烦的方式。

干杯!

5 个答案:

答案 0 :(得分:2)

不重新发明轮子。如果您可以自由使用第三方库,您可以尝试使用强类型方法的Google Guava,而不使用静态初始化器和子类,代理Entry / Pair - 类似于可能的类或可变参数似乎不是类型安全的:

使用builder pattern

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

如果条目数最多为5,则甚至是shorter approach(请参阅重载,为什么所有这些地图工厂方法都是类型安全的):

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

答案 1 :(得分:0)

Java本身没有类似的东西。但是,您可能能够在其他JVM语言中找到此类功能。如果您有选择的自由,并且您喜欢动态类型和相关功能,同时保留类似Java的语法,请检查Groovy。

答案 2 :(得分:0)

您不能直接在Java中执行此类操作,但可以使用varargs和Pair类来模拟它。首先创建一个Pair类,如下所示。

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编写方法:

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,例如

Map<String, Integer> map = initialiseMap(Pair.of("Key1", 1), Pair.of("Key2", 2));

答案 3 :(得分:0)

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

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);

答案 4 :(得分:0)

尝试:

doMethod(new HashMap(){{ put("key", "value"); put("another", "value2"); }});

<强> Explenation:

  • {}块表示此实例属于匿名类扩展HashMap
  • 内部{}块表示复制到匿名类构造函数的代码。