37 votos

Python-como la comprensión de listas en Java

Dado que Java no permite pasar métodos como parámetros, ¿qué truco de hacer que se utiliza para implementar Python como la comprensión de listas en Java ?

Tengo una lista (ArrayList) de las Cadenas. Necesito transformar a cada elemento mediante el uso de una función de manera que puedo obtener otra lista. Tengo varias funciones que toma una Cadena como entrada y devuelve otra Cadena como de salida. ¿Cómo puedo hacer que un método genérico que se da la lista y la función como parámetros para que yo pueda obtener una lista con cada elemento de procesado. No es posible en el sentido literal de la palabra, pero ¿qué truco debo usar ?

La otra opción es escribir una nueva función para cada una de las más pequeñas de la Cadena de procesamiento de la función que simplemente se repite a lo largo de toda la lista, que es un poco no tan fresco.

30voto

Michael Myers Puntos 82361

Básicamente, se crea una Función de interfaz:

public interface Func<In, Out> {
    public Out apply(In in);
}

y, a continuación, pasar una subclase anónima a través de su método.

Su método se podría aplicar la función a cada elemento en el lugar:

public static <T> void applyToListInPlace(List<T> list, Func<T, T> f) {
    ListIterator<T> itr = list.listIterator();
    while (itr.hasNext()) {
        T output = f.apply(itr.next());
        itr.set(output);
    }
}
// ...
List<String> myList = ...;
applyToListInPlace(myList, new Func<String, String>() {
    public String apply(String in) {
        return in.toLowerCase();
    }
});

o crear un nuevo List (básicamente la creación de una asignación de la lista de entrada a la de salida de la lista):

public static <In, Out> List<Out> map(List<In> in, Func<In, Out> f) {
    List<Out> out = new ArrayList<Out>(in.size());
    for (In inObj : in) {
        out.add(f.apply(inObj));
    }
    return out;
}
// ...
List<String> myList = ...;
List<String> lowerCased = map(myList, new Func<String, String>() {
    public String apply(String in) {
        return in.toLowerCase();
    }
});

Que uno es preferible depende de su caso de uso. Si la lista es muy grande, en lugar de la solución puede ser la única solución viable; si usted desea aplicar a muchas funciones diferentes a la misma lista original para hacer muchas otras listas, usted va a querer la map versión.

14voto

Nat Puntos 6434

El Google de las Colecciones de la biblioteca tiene un montón de clases para trabajar con las colecciones y los iteradores en un nivel mucho más alto que el de Java soporta, y de manera funcional (filtro, mapa, doblar, etc.). Se define la Función y el Predicado en las interfaces y los métodos que utilizan para procesar colecciones de modo que usted no tiene que. También tiene funciones de conveniencia que hacer frente con la de Java generics menos ardua.

Yo también uso Hamcrest** para el filtrado de las colecciones.

Las dos bibliotecas son fáciles de combinar con adaptador de clases.


** Declaración de interés: I co-escribió Hamcrest

8voto

yurez Puntos 393

En Java 8, usted será capaz de utilizar el método de referencia:

List<String> list = ...;
list.replaceAll(String::toUpperCase);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X