2012-12-21 13 views
10

To pytanie jest rodzajem już zamieszczonych tutaj: How to convert Map<String, String> to Map<Long, String> using guavaDlaczego Guava nie zapewnia drogę do przekształcenia klucze mapę

Myślę, że odpowiedź od CollinD jest właściwe:

Wszystko metod guawy za przekształcenie i filtrowanie dają leniwe wyniki ... funkcja/predykat jest stosowany tylko wtedy, gdy jest potrzebny, ponieważ używany jest obiekt . Nie tworzą kopii. Z tego powodu transformacja może z łatwością złamać wymagania dla Set.

Załóżmy na przykład, że masz Map<String, String>, który zawiera "1" i "01" jako klucze. Oba są odrębne String s, a zatem Map może legalnie zawierać oba klucze. Jeśli jednak przekształcisz je za pomocą Long.valueOf(String), oba odwzorują na wartość 1. Są to już nie różne klucze. Nie spowoduje to żadnego uszkodzenia, jeśli użytkownik utworzy kopię mapy i doda wpisy, ponieważ każdy zduplikowany klucz nadpisze poprzedni wpis dla tego klucza. Jednakże, nie ma możliwości wymuszenia unikatowych kluczy , a zatem złamałby umowę z Map.

To prawda, ale w rzeczywistości nie rozumiem, dlaczego to nie jest wykonywana, ponieważ:

  • Gdy klucz transformacja zdarzyć, jeśli 2 klucze są „połączone” wyjątek środowiska wykonawczego może być podniesiony, czy moglibyśmy przejść flagę, aby wskazać Guava aby przyjąć dowolną wartość z wielu możliwych wartości nowo obliczoną klawisz (failfast/Failsafe możliwości!)

  • my może mieć Maps.transformKeys który wytwarza Multimap

Czy jest coś, czego nie widzę w robieniu takich rzeczy?

+0

Wydaje się być bardziej odpowiednie dla programistów.stackexchange.com –

Odpowiedz

8

Jak sugeruje @CollinD, nie ma sposobu, aby to zrobić w leniwy sposób. Aby zaimplementować get, musisz przekonwertować wszystkie klucze za pomocą funkcji transformacji (aby zapewnić wykrycie wszelkich duplikatów).

Zastosowanie Function<K,NewK> do Map<K,V> jest obecnie niedostępne.

Można bezpiecznie stosować Function<NewK,K> na mapie:

V value = innerMap.get(fn.apply(newK)); 

nie widzę skrót Guava na to - może nie tylko być na tyle użyteczne. Możesz uzyskać podobne wyniki dzięki:

Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn); 
Powiązane problemy