I have a Map<String, String>
the String
key is nothing but numeric value like "123" etc. I'm getting numeric value because this values are coming from the UI in my JSF component. I don't want to change the contract of UI component.
Now I would like to create a Map<Long, String>
based on the above Map
, I saw some transform
methods in the Maps
class but all are focusing on the converting value and not key.
Is there any better way to convert Map<String, String>
to Map<Long, String>
?
@Vivin's answer is correct, but I think it's useful to explain why Guava doesn't have any method to allow you to transform the keys of a Map
(or to transform a Set
at all).
All of Guava's methods for transforming and filtering produce lazy results... the function/predicate is only applied when needed as the object is used. They don't create copies. Because of that, though, a transformation can easily break the requirements of a Set
.
Let's say, for example, you have a Map<String, String>
that contains both "1" and "01" as keys. They are both distinct String
s, and so the Map
can legally contain both as keys. If you transform them using Long.valueOf(String)
, though, they both map to the value 1
. They are no longer distinct keys. This isn't going to break anything if you create a copy of the map and add the entries, because any duplicate keys will overwrite the previous entry for that key. A lazily transformed Map
, though, would have no way of enforcing unique keys and would therefore break the contract of a Map
.