Potrzebuję funkcji mapy . Czy jest już coś takiego w Javie?
(Dla tych, którzy się zastanawiają: oczywiście wiem, jak sam zaimplementować tę banalną funkcję ...)
java
map-function
Albert
źródło
źródło
Odpowiedzi:
W JDK nie ma pojęcia funkcji od wersji java 6.
Guava ma jednak interfejs funkcji , a metoda zapewnia wymaganą funkcjonalność.
Collections2.transform(Collection<E>, Function<E,E2>)
Przykład:
Wynik:
W dzisiejszych czasach, w Javie 8, istnieje funkcja mapy, więc prawdopodobnie napisałbym kod w bardziej zwięzły sposób:
źródło
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Od wersji Java 8 istnieje kilka standardowych opcji umożliwiających to w JDK:
Zobacz
java.util.Collection.stream()
ijava.util.stream.Collectors.toList()
.źródło
toList()
. Wymiana na inny typ:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
można zastąpić tylkodoMap
?foo::doMap
lubFoo::doMap
.Istnieje wspaniała biblioteka o nazwie Functional Java, która obsługuje wiele rzeczy, które chciałbyś mieć Java, ale tak nie jest. Z drugiej strony jest też ten wspaniały język Scala, który robi wszystko, co powinna była zrobić Java, ale nie robi tego, jednocześnie będąc kompatybilnym ze wszystkim, co napisano dla JVM.
źródło
a.map({int i => i + 42});
czy rozszerzyli kompilator? lub dodany preprocesor?Uważaj
Collections2.transform()
na guawy. Największą zaletą tej metody jest też największe niebezpieczeństwo: jej lenistwo.Spójrz na dokumentację
Lists.transform()
, która moim zdaniem dotyczy równieżCollections2.transform()
:Również w dokumentacji
Collections2.transform()
wspominają, że masz podgląd na żywo, że zmiana na liście źródeł wpływa na przekształconą listę. Takie zachowanie może prowadzić do trudnych do wyśledzenia problemów, jeśli programista nie zdaje sobie sprawy, jak to działa.Jeśli chcesz mieć bardziej klasyczną „mapę”, która będzie działać tylko raz, to lepiej będzie, jeśli chcesz
FluentIterable
, również z Guawy, która ma znacznie prostszą operację. Oto przykład google:transform()
tutaj jest metoda mapy. Używa tej samej funkcji <> "wywołania zwrotne" coCollections.transform()
. Lista, którą otrzymujesz, jest jednak tylkocopyInto()
do odczytu , użyj jej, aby uzyskać listę do odczytu i zapisu.W przeciwnym razie, oczywiście, gdy java8 wyjdzie z lambdami, będzie to przestarzałe.
źródło
To jest kolejna funkcjonalna biblioteka, z którą możesz korzystać z mapy: http://code.google.com/p/totallylazy/
źródło
Choć to stare pytanie, chciałbym pokazać inne rozwiązanie:
Po prostu zdefiniuj własną operację za pomocą generycznych java i strumieni Java 8:
Niż możesz napisać taki kod:
źródło