簡體   English   中英

Java:通用鍵值,例如C#

[英]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.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM