簡體   English   中英

Map.ofEntries() 代替 Map.of() 有什么用

[英]What is the use of Map.ofEntries() instead of Map.of()

來自Map.java的文檔 -

Map.of()Map.ofEntries()靜態工廠方法提供了一種創建不可變映射的便捷方法。

但是當我已經可以使用重載方法時......

Map.of("k1","v1","k2","v2","k3","v3"...);

... Map.ofEntries 的用途是什么?

返回包含從給定條目中提取的鍵和值的不可變映射,並且條目本身不存儲在映射中。

關於如何創建 26 個元素的 Map 的任何猜測?

您已經鏈接的 Map 中的兩個工廠方法之間的主要區別在於:

Map.ofEntries

返回包含從給定條目(不受計數限制)中提取的鍵和值的不可變映射

來自JEP-269:Convenience Factory Methods for Collections

對於較大數量的條目,將提供一個 API,該 API 將在給定任意數量的鍵值對的情況下創建一個 Map 實例:

 Map.ofEntries(Map.Entry<K,V>...)

雖然這種方法類似於 List 和 Set 的等效可變參數 API,但不幸的是,它需要對每個鍵值對進行裝箱。 一種裝箱鍵和值的方法,適用於靜態導入,將使這更方便:

 Map.Entry<K,V> entry(K k, V v)

您對 Map 中的 .of .of()方法的假設有些不正確,可能是因為這會用 Java9 編譯:

List<Integer> values = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // note 11 elements here

Set<String> keys = Set.of("z", "o", "tw", "th", "fo", "fi", "si", "se", "e", "n", "te");

另一方面,這不會:

Map<String, Integer> map = Map.of("z", 0, "o", 1,
      "tw", 2, "th", 3, "fo", 4, "fi", 5,
      "si", 6, "se", 7, "e", 8, "n", 9, "te", 10); // this would not compile

原因是因為List.ofSet.of有一個可變參數實現,但是要為Map創建一個類似的 API,鍵和值也應該按照 JEP 中的說明進行裝箱。 因此,使用Map.entry()類型的可變參數創建了相同的內容:

Map<String, Integer> map = Map.ofEntries(Map.entry("z",0),
       Map.entry("o",1),Map.entry("t",2)...so on);

此外,從Map.entry()的文檔中也引入了自:9 -

返回包含給定鍵和值的不可變Map.Entry 這些條目適用於使用Map.ofEntries()方法填充 Map 實例。

該方法創建的Entry實例具有以下特點:

  • 它們不允許空鍵和值。 嘗試使用空鍵或值創建它們會導致 NullPointerException。

  • 它們是不可變的。 對返回的 Entry 調用 Entry.setValue() 導致 UnsupportedOperationException。

  • 它們不可序列化。

  • 它們是基於價值的。 調用者不應假設返回實例的身份。 此方法可以自由地創建新實例或重用現有實例。 因此,對這些實例的身份敏感操作(引用相等 (==)、身份哈希碼和同步)是不可靠的,應該避免。

類似於最近介紹的Immutable Map靜態工廠方法的特性。

Java 9 引入了使用簡潔的一行代碼創建不可修改的小型 Collection 實例,對於映射,工廠方法的簽名是:

static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3)

此方法被重載為具有 0 到 10 個鍵值對,例如

Map<String, String> map = Map.of("1", "first");
Map<String, String> map = Map.of("1", "first", "2", "second");
Map<String, String> map = Map.of("1", "first", "2", "second", "3", "third");

同樣,您最多可以有十個條目。

對於我們有超過 10 個鍵值對的情況,有一種不同的方法:

static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

這是用法。

Map<String, String> map = Map.ofEntries(
  new AbstractMap.SimpleEntry<>("1", "first"),
  new AbstractMap.SimpleEntry<>("2", "second"),
  new AbstractMap.SimpleEntry<>("3", "third"));

嗯,這很簡單。 Map.of()不是可變參數方法。 只有最多 10 個條目的重載Map.of() 另一方面, Map.ofEntries()是一個可變參數方法,因此允許您根據需要指定Map.ofEntries()數量的條目。

他們本可以添加Map.ofEntries()但由於很多時候你只需要幾個條目,他們還包括Map.of()版本作為便利方法,這樣你就不需要將每個鍵值對包裝在里面一個Entry

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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