![](/img/trans.png)
[英]how to transform Map<String,String> to List<String> using google collections
[英]How to transform List<String> to Map<String,String> with Google collections?
我有一個字符串列表,我有一個函數可以為列表中的每個鍵生成一個值。
我想使用此功能創建地圖。 我可以使用 Google 集合執行此操作嗎?
使用Maps.uniqueIndex(Iterable, Function) :
返回一個不可變映射,其中 Map.values() 是給定順序中的給定元素,每個鍵是對其相應值調用提供的函數的產物。 (來自 javadoc)
例子:
Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
public String apply(String from) {
// do stuff here
return result;
}});
截至 2012 年 7 月 26 日,番石榴大師包含兩種新方法來做到這一點。 它們應該在 14.0 版中。
Maps.asMap(Set<K>, Function<? super K, V>)
(以及SortedSet
和NavigableSet
兩個重載)允許您將Set
和Function
作為Map
查看,其中Set
中每個鍵的值是將該函數應用於該鍵的結果。 結果是一個視圖,因此它不會復制輸入集,並且Map
結果將隨着集的變化而變化,反之亦然。
Maps.toMap(Iterable<K>, Function<? super K, V>)
接受一個Iterable
並急切地將它轉換為一個ImmutableMap
,其中 iterable 的不同元素是鍵,值是將函數應用於每個的結果鑰匙。
編輯:肖恩完全有可能是對的,我誤解了這個問題。
如果原始列表是keys ,那么聽起來您可能只能通過MapMaker.makeComputingMap
使用計算地圖,而忽略輸入列表開始。 編輯:如評論中所述,現在已在 Guava 15.0 中棄用並刪除。 來看看CacheBuilder
。
另一方面,這也不會為您提供一個映射,如果您要求它提供與開始時不在列表中的鍵對應的值,則該映射將返回 null。 它也不會給你換而言之,這很可能是不合適的,但它是值得考慮的,這取決於你想用它做什么。 :)
我會把這個答案留在這里,除非你評論說這里的兩種方法對你都沒有用,在這種情況下我會刪除它。
原答案
使用Guava,您可以使用Maps.uniqueIndex
輕松完成此Maps.uniqueIndex
:
Map<String, String> map = Maps.uniqueIndex(list, keyProjection);
(我特別提到了 Guava,而不是 Google 集合,因為我還沒有檢查舊的 Google 集合存儲庫是否包含Maps.uniqueIndex
。)
要么我誤解了你,要么其他海報都誤解了。 我知道您希望您的列表成為地圖鍵,而Maps.uniqueIndex()
創建鍵以映射到您的值(這恰恰相反)。
無論如何,有一個開放的 Guava 問題需要您請求的確切功能,我也為之前的問題實施了這樣的解決方案。
使用番石榴 + Lambda
Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.