[英]Java: Generic keyvalue like C#
我目前正在尋找Java中執行類似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);
不幸的是,如果您需要做很多事情,那是一種麻煩的方式。
干杯!
無需重新發明輪子。 如果您可以自由使用3rd-party庫,則可以嘗試使用提供強類型化方法的Google Guava,而無需使用靜態初始值設定項和子類,替代類似Entry
/ Pair
的類或可變參數(可能看起來不安全):
使用構建器模式 :
final Map<String, Object> map = new ImmutableMap.Builder<String, Object>()
.put("key", "value")
.put("anoter", "value2")
.build();
DoMethod(map);
如果條目數最多為5,甚至可以采用更短的方法 (請參見重載,為什么所有這些映射工廠方法都是類型安全的):
final Map<String, Object> map = ImmutableMap.<String, Object>of("key", "value", "anoter" "value2");
DoMethod(map);
Java本身沒有類似的東西。 但是,您也許可以在其他JVM語言中找到此類功能。 如果您有選擇的自由,並且喜歡動態鍵入和相關功能,同時又保留了類似Java的語法,請檢查Groovy。
您不能直接在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));
一個簡單的解決方案是使用一對參數。
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);
嘗試:
doMethod(new HashMap(){{ put("key", "value"); put("another", "value2"); }});
解釋:
{}
塊表示此實例屬於HashMap
擴展的匿名類。 {}
塊表示將代碼復制到匿名類的構造函數中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.