Jak przekształcić listę w mapę za pomocą Google collections?

Mam listę łańcuchów i mam funkcję do generowania wartości dla każdego klucza na liście.

Chcę utworzyć mapę za pomocą tej funkcji. Czy Mogę to zrobić z Google collections?

Author: Matthias Braun, 2011-02-15

5 answers

Od 26.07.2012 guava master zawiera dwa nowe sposoby na to. Powinny być w wersji 14.0.

Maps.asMap(Set<K>, Function<? super K, V>) (a dwa przeciążenia dla SortedSet i NavigableSet) pozwalają wyświetlić Set plus a Function jako Map, gdzie wartość dla każdego klucza w zestawie jest wynikiem zastosowania funkcji do tego klucza. Wynikiem jest widok, więc nie kopiuje zestawu wejściowego, a wynik Map zmieni się w miarę działania zestawu i odwrotnie.

Maps.toMap(Iterable<K>, Function<? super K, V>) przyjmuje an Iterable i chętnie konwertuje je na an ImmutableMap gdzie poszczególne elementy iterowalne są kluczami, a wartości są wynikiem zastosowania funkcji do każdego klucza.

 23
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 01:25:43

Użyj Map.uniqueIndex( Iterable, Function) :

Zwraca niezmienną mapę, dla której Mapa.wartości() to podane elementy w danej kolejności, a każdy klucz jest produkt wywołania dostarczonego funkcja na odpowiadającej jej wartości. (z javadoc)

Przykład:

Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
  public String apply(String from) {
    // do stuff here
    return result;
  }});
 86
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 21:50:22

EDIT: jest całkowicie możliwe, że Sean ma rację i źle zrozumiałem pytanie.

Jeśli oryginalna lista ma być kluczami , to wygląda na to, że możesz po prostu użyć mapy obliczeniowej, poprzez MapMaker.makeComputingMap, i Ignoruj listę wejściową na początek. EDIT: jak wspomniano w komentarzach, jest to teraz przestarzałe i usunięte w Guava 15.0. spójrz na CacheBuilder zamiast tego.

Z drugiej strony, to również nie daje mapy, która zwróci null, jeśli zapytasz go o wartość odpowiadającą kluczowi, którego nie było na liście. To również nie daje w innych słowach, to może dobrze Nie być odpowiednie, ale warto rozważyć, w zależności od tego, co próbujesz z nim zrobić. :)

Zostawię tutaj tę odpowiedź, chyba, że skomentujesz, że żadne podejście tutaj nie jest dla ciebie użyteczne, w takim przypadku je skasuję.


Oryginalna odpowiedź

Używając guawa możesz to zrobić dość łatwo z Maps.uniqueIndex:

Map<String, String> map = Maps.uniqueIndex(list, keyProjection);

(wspomniałem konkretnie o Guava w przeciwieństwie do zbiorów Google, ponieważ nie sprawdziłem, czy starsze repozytorium zbiorów Google zawiera Maps.uniqueIndex.)

 15
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 10:34:14

Albo źle zrozumiałam ciebie, albo inne plakaty. Rozumiem, że chcesz, aby Twoja lista była kluczem do mapy, podczas gdy Maps.uniqueIndex() tworzy Klucze do mapowania wartości (co jest wręcz przeciwne).

W każdym razie istnieje otwarty problem z Guavą , który wymaga dokładnej funkcjonalności, o którą prosisz, a ja również zaimplementowałem takie rozwiązanie w poprzednim pytaniu.

 13
Author: Sean Patrick Floyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:31

Używanie Guawy + Lamba

 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
 6
Author: Carlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 09:19:04