我有一個Map<String, String>
這個String
這個鍵只不過是數值,比如「123」等。我得到的數值是因爲這個值來了來自我的JSF組件中的UI。我不想更改UI組件的合約。
現在我想根據上面的Map
創建一個Map<Long, String>
,我在Maps
類中看到了一些transform
方法,但都是關注轉換值而不是關鍵。
有沒有更好的方法將Map<String, String>
轉換爲Map<Long, String>
?如何將Map <String,String>轉換爲Map <Long,String>使用番石榴
回答
更新的Java 8
您可以使用流來做到這一點:
Map<Long, String> newMap = oldMap.entrySet().stream()
.collect(Collectors.toMap(e -> Long.parseLong(e.getKey()), Map.Entry::getValue));
這是假定所有鍵的Long
S適用字符串表示。另外,轉換時可能會發生碰撞;例如,"0"
和"00"
都映射到0L
。
我認爲你必須遍歷在地圖上:
Map<Long, String> newMap = new HashMap<Long, String>();
for(Map.Entry<String, String> entry : map.entrySet()) {
newMap.put(Long.parseLong(entry.getKey()), entry.getValue());
}
此代碼假定你已經在消毒所有map
值(所以沒有無效的長值)。
我希望有一個更好的解決方案。
編輯
我碰到在下議院收藏-utils的的從頭開始,它只適用於實現CollectionUtils#transformedCollection(Collection, Transformer)
方法看起來似乎你想要做什麼來了。Collection
的類。
@ Vivin的回答是正確的,但我認爲這有助於解釋爲什麼番石榴沒有任何方法讓您轉換Map
(或轉換Set
)的密鑰。
所有Guava的轉換和過濾方法都會產生延遲結果...函數/謂詞僅在需要使用對象時纔會應用。他們不創建副本。正因爲如此,轉換可以很容易地打破Set
的要求。
比方說,例如,您有一個包含「1」和「01」作爲關鍵字的Map<String, String>
。它們都是不同的String
s,因此Map
可以合法地包含這兩個鍵。如果使用Long.valueOf(String)
轉換它們,則它們都映射到值1
。他們不再是獨特的鑰匙。如果您創建映射副本並添加條目,這不會破壞任何內容,因爲任何重複的鍵都會覆蓋該鍵的前一個條目。然而,延遲變形的Map
將無法執行唯一密鑰,因此會破壞Map
的合同。
對不起,我直到後來纔看到guava標籤:p – 2011-04-20 18:14:30
簡短的回答是不,番石榴不提供這個開箱即用。
簡單的方法將如下所示。但是,有一些警告。
public static <K, V, L, W> Map<L, W> transformMap(Map<K, V> map, Function<K, L> keyFunction, Function<V, W> valueFunction) {
Map<L, W> transformedMap = newHashMap();
for (Entry<K, V> entry : map.entrySet()) {
transformedMap.put(
keyFunction.apply(entry.getKey()),
valueFunction.apply(entry.getValue()));
}
return transformedMap;
}
public static <K, V, L> Map<L, V> transformKeys(Map<K, V> map, Function<K, L> keyFunction) {
return transformMap(map, keyFunction, Functions.<V>identity());
}
番石榴的變壓器都「懶」或視圖爲主。我認爲要實現一個映射關鍵變換器,你需要一個雙向函數。我的理解是,Guava團隊正在開發一款Converter,它可以解決這個問題。
你碰到的另一個問題是,你必須處理重複的可能性,以便爲「Jimmy-proof」,另一個番石榴原則。處理該問題的一種方法是返回Multimap;另一種情況是在遇到重複項時拋出異常。我不會建議的是隱藏問題,例如通過忽略重複鍵的後續條目,或者用重複鍵覆蓋新條目。
您現在可以使用Java 8流,map,collect以更易讀,乾淨的方式執行此操作。
Map<String, String> oldMap
Map<Long, String> newMap = oldMap.entrySet().stream()
.collect(Collectors.toMap(entry -> Long.parseLong(entry.getKey()), Map.Entry::getValue));
這裏是下面的答案之一的更新版本,使生成的地圖不可修改的(不,它不是用番石榴,只是普通的Java 8):
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toMap;
...
newMap = oldMap.entrySet().stream().collect(collectingAndThen(
toMap((Map.Entry<String, String> entry) -> transformKey(entry.getKey()),
(Map.Entry<String, String> entry) -> transformValue(entry.getValue())),
Collections::unmodifiableMap)));
- 1. 如何將HashMap <String,Integer> param轉換爲Map <String,Object)
- 2. 如何使用相同的遞歸函數迭代Map <String,String>和Map <String,Map <String,String >>?
- 3. 如何將List [List [Map [String,String]]]轉換爲List [Map [String,String]]
- 4. 無法從列表<map <string,object >>轉換爲列表<map <string,string >>
- 5. For-Each Loop,Map <String,Map <String,List <String> >>
- 6. Map <String,Map <String,Boolean >> myMap = new HashMap <String,HashMap <String,Boolean >>();
- 7. 如何將Map [String,Any]轉換爲Json?
- 8. 如何將breeze.linalg.DenseMatrix轉換爲Map [String,Value]?
- 9. map <string,string>在類
- 10. 如何在JAVA中將JAVAScript對象轉換爲Map <String,String>?
- 11. Post Map <String,List <String>>
- 12. 將undefined轉換爲map <string,AnonymousModel>時出錯
- 13. std :: map <string,string>轉換爲字符串(第一個值)
- 14. 將Map [String,Double]轉換爲java.util.Map [String,java.lang.Double]
- 15. 番石榴:我如何將Collection <T>轉換爲Collection <Optional<T>>?
- 16. 番石榴的ComparisonChain轉換爲JavaScript
- 17. 番石榴功能
- 18. 番石榴的三元運算符問題:無法從訂購<Comparable>轉換爲訂購<String>
- 19. 將List <Map <String,Object >> row`的null轉換爲空字符串
- 20. 從List <Map <String,Object >>創建HashMap <String,Map>給出java.lang.ClassCastException
- 21. 如何轉換XML列出<Map>
- 22. map <string,pair <string,foo * >>和map <string,pair <string,foo&>>有什麼區別?
- 23. 將Map <Integer,Object>轉換爲Map <Integer,List <Object>>,不使用for循環(java)
- 24. 轉換List <HashMap <String,String >>到列表<map <String,String >> java
- 25. 如何使用JSTL迭代Map <String,List> map = new HashMap <String,List>()在jsp頁面中使用JSTL
- 26. 番石榴 - 過濾和轉換圖
- 27. Sort Map <String,List <Object[]>>
- 28. 使用鍵值在jsp中訪問Map <Long,Map <String,Object >>的內容
- 29. Hibernate如何映射Map <Object,String>
- 30. 將值添加到列表<Map <String,String >>
我不認爲有一個內置功能爲此。雖然我沒有看到太多用處,但您可能需要[提交功能請求](http://code.google.com/p/guava-libraries/issues/list)。 – 2011-04-20 15:58:10