有沒有辦法創建(/回傳)不可修改的 Multimap?
我正在使用 com.google.common.collect 的 Multimap 并且需要創建一個不可修改的 Multimap,但我找不到具有方法的庫,該方法將給定的 Multimap 作為不可修改的 Multimap 回傳。
對于“普通”地圖,我通常使用 org.apache.commons.collections4.MapUtils lib 的 MapUtils.unmodifiableMap(map) 方法。
例子:
public static Map<String, String> bufferName()
{
Map<String, String> fooMap = new HashMap<>();
fooMap.put("foo", "bar");
return MapUtils.unmodifiableMap(fooMap);
}
我需要的:
public static Multimap<String, String> bufferName1()
{
HashMultimap<String, String> fooMultimap = HashMultimap.create();
fooMultimap.put("foo", "bar");
fooMultimap.put("foo", "foobar");
// ! the next line needs to be optimized so that the returned HashMultimap cannot be modified.
return fooMultimap;
}
我試圖找到一個庫,它可以將給定的可變 Multimaps 作為不可變 Multimaps 回傳,但找不到任何東西。
我還嘗試將可變的 Multimap 放入一個不可變的物件中,但這不是干凈的。
例子:
public static Set<HashMultimap<String, String>> bufferName1()
{
HashMultimap<String, String> fooMultimap = HashMultimap.create();
fooMultimap.put("foo", "bar");
fooMultimap.put("foo", "foobar");
// org.apache.commons.collections4.SetUtils
SetUtils.unmodifiableSet(Set.of(fooMultimap));
}
uj5u.com熱心網友回復:
Java 自己的核心庫是一個通用庫。
Guava 是一個通用庫。
Apache commons 是一個通用庫。
你在一個奇怪的混搭中使用了所有 3 個。這不是一個好主意。一般來說,apache的東西質量極低。guava 和 apache-commons 存在的原因首先是由于核心庫中缺乏實用性,但在過去十年左右(請注意,guava 和 apache-commons 非常古老),核心庫有一直在快速添加東西。
因此,我肯定會擺脫 apache,也可能擺脫 guava;核心庫現在可以做到這一切。
僅使用番石榴獲得不可變的多圖
番石榴有類ImmutableListMultimap
和ImmutableSetMultimap
. 他們有一個copyOf
靜態的“建構式”。所以這ImmutableSetMultimap.copyOf(myMutableMultimap)
就是你所需要的。
僅使用 java 核心獲取不可變的多圖
Java 核心的多重映射略有不同。而不是 a Multimap<Integer, String>
,您有 a Map<Integer, List<String>>
(或者Set<String>
,鏡像 guava 的多圖如何具有 'SetMultimap' 和 'ListMultimap' 變體)。它的主要缺點,大概也是 guava 擁有多圖的原因,是添加一個新元素聽起來真的很復雜。你必須先得到集合/串列。如果存在,請使用它。如果它不存在,請創建它,然后使用它。
除了 Java9 之后,它不再那么復雜了:
Map<Integer, List<String>> multimap = new HashMap<>();
int k = 5;
String v = "hello";
// add a new item:
multimap.computeIfAbsent(5, x -> new ArrayList<>()).add(v);
computeIfAbsent
是讓這道菜變得可口的關鍵。
鑒于它“只是一張地圖”,您可以Collections.unmodifiableMap()
照常使用。
Guava 的 multimap 還是有優勢的;您可能想繼續使用它。
但是apache在這里無能為力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/521548.html
標籤:爪哇多图不可修改