titledborder poner ejemplo borde java map-function

poner - setbounds java



Java: ¿hay una función de mapa? (5)

Necesito una función de map . ¿Ya hay algo como esto en Java?

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




Hay una maravillosa biblioteca llamada Functional Java que maneja muchas de las cosas que querría que tuviera Java, pero no es así. Por otra parte, también está este maravilloso lenguaje de Scala, que hace todo lo que Java debería haber hecho, pero no lo hace, sin dejar de ser compatible con cualquier cosa escrita para la JVM.


No hay ninguna noción de una función en el JDK a partir de java 6.

Guava embargo, Guava tiene una interfaz de Function y el
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, por lo que probablemente escriba el código de una manera más concisa:

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


Tenga mucho cuidado con Collections2.transform() de 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 a Collections2.transform() :

La función se aplica perezosamente, se invoca cuando es necesario. Esto es necesario para que la lista devuelta sea una vista, pero significa que la función se aplicará muchas veces para operaciones masivas como List.contains (java.lang.Object) y List.hashCode (). Para que esto funcione bien, la función debe ser rápida. Para evitar la evaluación diferida cuando la lista devuelta no necesita ser vista, copie la lista devuelta en una nueva lista de su elección.

También en la documentación de Collections2.transform() mencionan que obtienes una vista en vivo, ese cambio en la lista fuente afecta la lista transformada. Este tipo de comportamiento puede llevar a problemas difíciles de seguir si el desarrollador no se da cuenta de la forma en que funciona.

Si quieres un "mapa" más clásico, que se ejecutará una sola vez, entonces estarás mejor con FluentIterable , también de Guava, que tiene una operación que es mucho más simple. Aquí está el ejemplo de google:

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

transform() aquí está el método del mapa. Utiliza la misma función <> "callbacks" como Collections.transform() . La lista que recibe es de solo lectura, use copyInto() para obtener una lista de lectura y escritura.

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