2010-10-26 15 views
8

Estoy buscando una forma simple de aplicar un método de devolución de llamada a cada elemento en una matriz de cadena. Por ejemplo, en PHP puedo hacer todos los elementos en una matriz como esta:Java: Aplicar devolución de llamada a valores de matriz

$array = array_map('strtolower', $array); 

¿Hay una manera simple de lograr esto en Java?

+0

¿Qué hace esa línea? No es exactamente expresivo. – skaffman

+0

@skaffman - La función strtolower() de PHP devuelve una cadena con mayúsculas y minúsculas, similar a la de Java .toLowerCase(). La función anterior aplica (mapea) la función strtolower() a cada elemento en $ array, devolviendo así una matriz con todos los elementos con menor entubación. – mellowsoon

Respuesta

3

No hay de una sola línea utilizando una función de funcionalidad, pero sin duda se puede igualar la funcionalidad mediante la iteración en la matriz:

String[] arr = new String[...]; 

... 

for(int i = 0; i < arr.length; i++){ 
    arr[i] = arr[i].toLowerCase(); 
} 
+0

+1 Si bien hay respuestas interesantes para resolver la pregunta mencionada, a veces, especialmente para alguien que está aprendiendo un nuevo idioma, sencillo y sencillo triunfa ingenioso. – Bill

+0

Voy a tener que ir con esta respuesta. Las otras respuestas son buenos ejemplos de asignación de elementos de matriz, pero las soluciones son mucho más complicadas que la iteración simple, que es lo que estaba tratando de simplificar. – mellowsoon

7

En primer lugar, las matrices de objetos en Java son muy inferiores a List s, por lo que en realidad debería usarlas si es posible. Puede crear una vista de String[] como List<String> usando Arrays.asList.

En segundo lugar, Java aún no tiene expresiones lambda o referencias de métodos, por lo que no hay una manera bonita de hacerlo ... y hacer referencia a un método por su nombre como String es altamente propenso a errores y no es una buena idea.

Dicho esto, Guava proporciona algunos elementos funcionales básicos que le permitan hacer lo que quiera:

public static final Function<String, String> TO_LOWER = 
    new Function<String, String>() { 
     public String apply(String input) { 
     return input.toLowerCase(); 
     } 
    }; 

// returns a view of the input list with each string in all lower case 
public static List<String> toLower(List<String> strings) { 
    // transform in Guava is the functional "map" operation 
    return Lists.transform(strings, TO_LOWER); 
} 

A diferencia de la creación de una nueva matriz o List y la copia de la versión en minúsculas de cada String en ella, esto hace no iterar los elementos del original List cuando se creó y requiere muy poca memoria.

Con Java 8, expresiones lambda y referencias método debe finalmente ser añadido a Java, junto con los métodos de extensión de funciones de orden superior como map, haciendo de este mucho más fácil (algo así):

List<String> lowerCaseStrings = strings.map(String#toLowerCase); 
+0

Quiero aceptar su respuesta, porque así es como esperaba que se hiciera. Pero hombre ... Esa es una gran biblioteca para agregar a mi proyecto para un solo uso. :/ – mellowsoon

+0

@mellowsoon: créanme, hay muchas otras razones para usar guayaba. Este es solo un pequeño ejemplo. – ColinD

1

se podría utilizar la reflexión:

String[] map(java.lang.reflect.Method method, String[] array) { 
    String[] new_array = new String[array.length]; 
    for (int i = 0; i < array.length; i++) new_array[i] = (String)method.invoke(null, new Object[]{array[i]}); 
    return new_array; 
} 

Luego solo tiene que declarar un método estático en alguna parte y obtener una referencia utilizando la API de reflexión.

+0

Tan molesto como tener que crear clases detalladas para este tipo de cosas, la reflexión realmente no es una opción viable. La necesidad de utilizar literales de cadena propensos a errores para nombres de métodos (que se rompen si se cambia el nombre de un método) y la falta de cualquier tipo de seguridad en cuanto a los parámetros y el tipo de retorno del método lo hacen extremadamente frágil. – ColinD

+0

No es más frágil que el código PHP del OP :) –

+0

Tiene toda la razón al respecto, pero definitivamente no es algo que me gustaría ver emulado en ninguna parte. – ColinD

Cuestiones relacionadas