簡體   English   中英

如何轉換列表<String>到地圖<String,String>使用 Google 收藏?

[英]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>) (以及SortedSetNavigableSet兩個重載)允許您將SetFunction作為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.

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