Dlaczego Guava nie zapewnia sposobu na przekształcenie klawiszy mapy
To pytanie jest już opublikowane tutaj:Jak przekonwertować Map <String, String> na Mapę <Long, String> używając guava
Myślę, że odpowiedź CollinD jest właściwa:
Wszystkie metody Guawy do transformacji i filtrowania dają leniwe wyniki ... funkcja / predykat jest stosowana tylko wtedy, gdy jest potrzebny, gdy obiekt jest używany. Nie tworzą kopii. Z tego powodu transformacja może łatwo złamać wymagania aSet
.
Powiedzmy na przykład, że maszMap<String, String>
który zawiera zarówno „1”, jak i „01” jako klucze. Oba są odrębneString
s, i takMap
może legalnie zawierać oba klucze. Jeśli je przetransformujeszLong.valueOf(String)
jednak oba odwzorowują wartość1
. Nie są już odrębnymi kluczami. To nic nie zepsuje, jeśli utworzysz kopię mapy i dodasz wpisy, ponieważ wszelkie powielone klucze zastąpią poprzedni wpis dla tego klucza. Leniwie przemienionyMap
nie miałby jednak możliwości egzekwowania unikalnych kluczy, a zatem złamałby umowę zMap
.
To prawda, ale tak naprawdę nie rozumiem, dlaczego tak się nie dzieje, ponieważ:
Gdy nastąpi transformacja klucza, jeśli 2 klucze są „scalone”, może zostać wygenerowany wyjątek czasu wykonywania lub możemy przekazać flagę wskazującą Guava, aby wziął dowolną wartość wielu możliwych wartości nowo obliczonego klucza (możliwości awaryjnego / bezpiecznego) )
Możemy mieć Maps.transformKeys, który tworzy Multimap
Czy jest jakaś wada, której nie widzę w robieniu takich rzeczy?