Necesito una función de mapa . ¿Hay algo como esto en Java ya?
(Para aquellos que se preguntan: por supuesto, sé cómo implementar esta función trivial yo mismo ...)
java
map-function
Albert
fuente
fuente
Respuestas:
No hay una noción de una función en el JDK a partir de java 6.
Sin embargo, Guava tiene una interfaz de función y el método proporciona la funcionalidad que necesita.
Collections2.transform(Collection<E>, Function<E,E2>)
Ejemplo:
Salida:
En estos días, con Java 8, en realidad hay una función de mapa, por lo que probablemente escribiría el código de una manera más concisa:
fuente
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Desde Java 8, hay algunas opciones estándar para hacer esto en JDK:
Ver
java.util.Collection.stream()
yjava.util.stream.Collectors.toList()
.fuente
toList()
. Sustitución a otro tipo:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
puede reemplazar por solodoMap
?foo::doMap
oFoo::doMap
.Hay una biblioteca maravillosa llamada Functional Java que maneja muchas de las cosas que le gustaría que Java tuviera pero no las tiene. Por otra parte, también está este maravilloso lenguaje Scala que hace todo lo que Java debería haber hecho, pero no lo hace mientras sigue siendo compatible con cualquier cosa escrita para la JVM.
fuente
a.map({int i => i + 42});
¿extendieron el compilador? o preprocesador agregado?Ten mucho cuidado con la
Collections2.transform()
guayaba. La mayor ventaja de ese método es también su mayor peligro: su pereza.Mire la documentación de
Lists.transform()
, que creo que se aplica también aCollections2.transform()
:También en la documentación de
Collections2.transform()
que mencionan que obtienes una vista en vivo, ese cambio en la lista fuente afecta la lista transformada. Este tipo de comportamiento puede conducir a problemas difíciles de rastrear si el desarrollador no se da cuenta de cómo funciona.Si quieres un "mapa" más clásico, que se ejecutará una vez y solo una vez, entonces es mejor que
FluentIterable
, también de Guava, que tiene una operación que es mucho más simple. Aquí está el ejemplo de Google para ello:transform()
Aquí está el método de mapa. Utiliza la misma función <> "devoluciones de llamada" queCollections.transform()
. Sin embargo, la lista que obtiene es de solo lectura, úselacopyInto()
para obtener una lista de lectura y escritura.De lo contrario, por supuesto, cuando java8 salga con lambdas, esto será obsoleto.
fuente
Esta es otra biblioteca funcional con la que puede usar el mapa: http://code.google.com/p/totallylazy/
fuente
Aunque es una vieja pregunta, me gustaría mostrar otra solución:
Simplemente defina su propia operación utilizando java generics y java 8 streams:
Entonces puedes escribir código como este:
fuente