2011-08-28 12 views
23

Supongamos que tengo una lista de coches:¿Cómo puedo llamar a un método en cada elemento de una lista?

public class Car { 
    private String brand; 
    private String name; 
    private String color; 

    public Car() { // ... } 

    public getName() { return name; } 
    // ... 
} 

// Suppose that I have already init the list of car 
List<Car> cars = //... 
List<String> names = new ArrayList<String>(); 


for (Car c : cars) { 
    names.add(c.getName()); 
} 

¿Cómo puedo acortar el código anterior? En pocas palabras, ¿cómo puedo llamar a un método en cada elemento de una lista?

Por ejemplo, en Python:

[car.name for car in cars] 

Respuesta

17

ACTUALIZACIÓN:

de answer para una solución de 8 Java utilizando una expresión lambda Ver scribaniwannabe.

original pre-Java 8 respuesta:

El efecto se puede lograr con la guayaba, la implementación Function ya es más detallado que lo que tienes:

List<Car> cars = //... 

Function<Car, String> carsToNames = new Function<Car, String>() { 
    @Override 
    public String apply(Car car) { 
     return car.getName(); 
    } 
} 

List<String> names = Lists.transform(cars, carsToNames); 

(Tenga en cuenta que Lists.transform devuelve una vista que aplicará la función de forma perezosa: si desea una copia inmediata, debe copiar la lista devuelta en una nueva lista.)

Esto lo hace no lo ayuda a acortar su código, pero es un ejemplo de lo detallado que es lograr el efecto deseado en Java.

Editar: Puede que tenga un vistazo a lambdaj, una biblioteca que parece acercarse a lo que está buscando. No he probado esto por mí mismo, pero la página de inicio muestra este ejemplo:

List<Person> personInFamily = asList(new Person("Domenico"), new Person("Mario"), new Person("Irma")); 
forEach(personInFamily).setLastName("Fusco"); 
2

aparte de deshacerse de los aparatos ortopédicos y/o en movimiento todo el código de una sola línea, que podría no ser una buena idea, no se puede.

38

Java 8 (con suerte) tendrá alguna forma de expresión lambda, lo que hará que código como este sea más factible. (Si hay algo así como la lista de comprensiones es otro asunto).

¡Su deseo ha sido concedido!

--- --- EDITAR
lol como si fuera una señal: forEach()

Sin duda este cabo.

Por su pregunta específicamente, se convierte en el folowing:

// Suppose that I have already init the list of car 
List<Car> cars = //... 
List<String> names = new ArrayList<String>(); 

// LAMBDA EXPRESSION 
cars.forEach((car) -> names.add(car.getName())); 

Es realmente increíble lo que han hecho aquí. Estoy emocionado de ver que esto se use en el futuro.

--- EDIT ---
Debería haberlo visto antes, pero no puedo resistirme a publicarlo.

La funcionalidad Stream agregada en jdk8 permite el map method.

// Suppose that I have already init the list of car 
List<Car> cars = //... 

// LAMBDA EXPRESSION 
List<String> names = cars.stream().map(car -> car.getName()).collect(Collectors.toList()); 
+1

Oh lambda, que belleza! –

+1

@ EM-Creations ¿No es ella pensó ... – aaiezza

0

En common-lisp hay una función mapcar (esto no tiene nada que ver con el coche-ejemplo anterior). Un mapcar-función general en Java:

static <LIST_TYPE, ELEM_TYPE> List<LIST_TYPE> mapcar(Collection<ELEM_TYPE> list, Function<ELEM_TYPE, LIST_TYPE> function) 
{ 
    return list.stream().map(function).collect(Collectors.toList()); 
} 

Para el coche-ejemplo:

List<String> carNames = mapcar(cars, car -> car.getName()); 
Cuestiones relacionadas