Этот вопрос уже опубликован здесь: Как преобразовать карту < String, String > к Map < Long, String > используя guava
Я думаю, что ответ CollinD уместен:
Все методы Guava для преобразования и фильтрации создают ленивые результаты... функция/предикат применяется только тогда, когда это необходимо объект используется. Они не создают копии. Из-за этого, однако, преобразование может легко нарушить требования a
Set
.Скажем, например, у вас есть
Map<String, String>
, который содержит как "1", так и "01". Они оба различныString
s, и поэтомуMap
может легально содержать как клавиши. Если вы преобразуете их, используяLong.valueOf(String)
, хотя они оба сопоставляются со значением1
. Они есть уже не отдельные ключи. Это ничего не сломает, если вы создать копию карты и добавить записи, потому что любой дубликат клавиши будут перезаписывать предыдущую запись для этого ключа. Ленько преобразованныйMap
, тем не менее, не будет иметь возможности принудительно использовать уникальные ключи и поэтому нарушит договор aMap
.
Это правда, но на самом деле я не понимаю, почему это не сделано, потому что:
-
Когда происходит трансформация ключа, если два ключа "объединены", может быть поднято исключение во время выполнения, или мы можем передать флаг, чтобы указать, что Guava принимает любое значение нескольких возможных значений для вновь вычисленных ключ (отказоустойчивые/отказоустойчивые возможности)
-
Мы могли бы иметь Maps.transformKeys, который создает Multimap
Есть ли недостаток, который я не вижу в таких вещах?