Comment puis-je appeler une méthode sur chaque élément d’une liste?

Supposons que j’ai une liste de voitures:

public class Car { private Ssortingng brand; private Ssortingng name; private Ssortingng color; public Car() { // ... } public getName() { return name; } // ... } 

 // Suppose that I have already init the list of car List cars = //... List names = new ArrayList(); for (Car c : cars ) { names.add(c.getName()); } 

Comment puis-je raccourcir le code ci-dessus? En un mot, comment puis-je appeler une méthode sur chaque élément d’une liste?

Par exemple, en Python:

 [car.name for car in cars] 

METTRE À JOUR:

Voir la réponse de aaiezza pour une solution Java 8 utilisant une expression lambda.

Réponse pré-Java 8 originale:

L’effet peut être obtenu avec Guava, l’implémentation de la Function est déjà plus détaillée que ce que vous avez:

 List cars = //... Function carsToNames = new Function() { @Override public Ssortingng apply(Car car) { return car.getName(); } } List names = Lists.transform(cars, carsToNames); 

(N’oubliez pas que Lists.transform renvoie une vue qui appliquera la fonction paresseusement. Si vous souhaitez une copie immédiate, vous devez copier la liste renvoyée dans une nouvelle liste.)

Cela ne vous aide donc pas à raccourcir votre code, mais constitue un exemple de la manière dont il est détaillé pour obtenir l’effet souhaité en Java.

Edit: Vous pouvez jeter un oeil à lambdaj , une bibliothèque qui semble s’approcher de ce que vous recherchez. Je n’ai pas essayé cela moi-même, mais la page d’accueil montre cet exemple:

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

Java 8 (espérons-le) aura une forme d’expression lambda, ce qui rendra le code plus réalisable. (Qu’il y ait quelque chose comme des listes compréhensibles est une autre affaire.)

Votre souhait a été exaucé!

—MODIFIER—
lol comme si cue: forEach ()

Vérifiez certainement ceci.

Pour votre question en particulier, cela devient le suivant:

 // Suppose that I have already init the list of car List cars = //... List names = new ArrayList(); // LAMBDA EXPRESSION cars.forEach( (car) -> names.add(car.getName()) ); 

C’est vraiment incroyable ce qu’ils ont fait ici. Je suis excité de voir cela utilisé dans le futur.

—MODIFIER—
J’aurais dû voir cela plus tôt mais je ne peux pas résister mais poster à ce sujet.

La fonctionnalité de stream ajoutée dans jdk8 permet la méthode de la carte .

 // Suppose that I have already init the list of car List cars = //... // LAMBDA EXPRESSION List names = cars.stream().map( car -> car.getName() ).collect( Collectors.toList() ); 

autrement que de vous débarrasser des accolades et / ou de déplacer tout le code sur une seule ligne, ce qui peut ne pas être une bonne idée, vous ne pouvez pas.

Si vous êtes bloqué et devez toujours utiliser Apache Commons, la classe Transformer peut vous aider: http://apachecommonstipsandsortingcks.blogspot.de/2009/01/examples-of-functors-transformers.html

En common-lisp, il y a une fonction mapcar (cela n’a rien à voir avec l’exemple de la voiture ci-dessus). Une fonction générale de mapcar en Java:

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

Pour la voiture-exemple:

 List carNames = mapcar(cars, car -> car.getName());