我目前正在寻找一种方法来做一些像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);
不幸的是,如果你需要做很多事情,这是一种麻烦的方式。
干杯!
答案 0 :(得分:2)
不重新发明轮子。如果您可以自由使用第三方库,您可以尝试使用强类型方法的Google Guava,而不使用静态初始化器和子类,代理Entry
/ Pair
- 类似于可能的类或可变参数似乎不是类型安全的:
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
。
{}
块表示复制到匿名类构造函数的代码。