Pregunta

map función. ¿Hay algo como esto en Java ya?

(Para aquellos que se preguntan: yo, por supuesto, saber cómo implementar esta función trivial mismo ...)

¿Fue útil?

Solución

No hay noción de una función en el JDK como de java 6.

Guava tiene un interfaz de Función sin embargo y la Red Collections2.transform(Collection<E>, Function<E,E2>)
método proporciona la funcionalidad que necesita.

Ejemplo:

// example, converts a collection of integers to their
// hexadecimal string representations
final Collection<Integer> input = Arrays.asList(10, 20, 30, 40, 50);
final Collection<String> output =
    Collections2.transform(input, new Function<Integer, String>(){

        @Override
        public String apply(final Integer input){
            return Integer.toHexString(input.intValue());
        }
    });
System.out.println(output);

Salida:

[a, 14, 1e, 28, 32]

En estos días, con Java 8, en realidad hay una función de mapa, así que probablemente me escribo el código de una manera más concisa:

Collection<String> hex = input.stream()
                              .map(Integer::toHexString)
                              .collect(Collectors::toList);

Otros consejos

Desde Java 8, hay algunas opciones estándar de hacer esto en el JDK:

Collection<E> in = ...
Object[] mapped = in.stream().map(e -> doMap(e)).toArray();
// or
List<E> mapped = in.stream().map(e -> doMap(e)).collect(Collectors.toList());

java.util.Collection.stream() y java.util.stream.Collectors.toList() .

Hay una biblioteca maravillosa que se llama Funcional Java que se ocupa de muchas de las cosas que te gustaría tener Java pero no lo hace. Por otra parte, también hay este maravilloso lenguaje Scala, que hace todo lo que debería haber hecho en Java, pero no sin dejar de ser compatible con cualquier cosa escrita para la JVM.

Tenga mucho cuidado con Collections2.transform() de guayaba. mayor ventaja de este método es también su mayor peligro:. su pereza

vistazo a la documentación de Lists.transform(), que creo que se aplica también a Collections2.transform():

  

La función se aplica con pereza, invoca cuando sea necesario. Esto es necesario   para la lista devuelta a ser un punto de vista, pero significa que la función   será aplicado muchas veces para las operaciones a granel como   List.contains (java.lang.Object) y List.hashCode (). Para que esto   un buen desempeño, la función debe ser rápido. Para evitar la evaluación perezosa cuando   la lista devuelta no tiene que ser un punto de vista, la copia de la lista devuelta   en una nueva lista de su elección.

También en la documentación de Collections2.transform() mencionan se obtiene una vista en vivo, que el cambio en la lista de origen afecta la lista transformado. Este tipo de comportamiento puede conducir a problemas difíciles de pista si el desarrollador no se da cuenta de la forma en que funciona.

Si quieres un "mapa" más clásica, que se ejecutará una vez y sólo una vez, entonces usted está mejor con FluentIterable , también de guayaba, que tiene una operación que es mucho más simple. Aquí está el ejemplo de Google para ello:

FluentIterable
       .from(database.getClientList())
       .filter(activeInLastMonth())
       .transform(Functions.toStringFunction())
       .limit(10)
       .toList();

transform() aquí es el método de mapa. Se utiliza la misma función <> "devoluciones de llamada", como Collections.transform(). La lista que se obtiene es de sólo lectura, sin embargo, el uso copyInto() para obtener una lista de lectura-escritura.

De lo contrario, por supuesto, cuando java8 sale con lambdas, esto será obsoleto.

Este es otro lib funcional con el que se puede usar el mapa: http://code.google.com / p / totallylazy /

sequence(1, 2).map(toString); // lazily returns "1", "2"

A pesar de que es una vieja pregunta que me gustaría mostrar otra solución:

Sólo definir su propia operación utilizando genéricos de Java y Java 8 secuencias:

public static <S, T> List<T> mapAll(Collection<S> collection, Function<S, T> mapper) {
   return collection.stream().map(mapper).collect(Collectors.toList());
}

De lo que puede escribir código como este:

List<String> hex = mapAll(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top