2010-08-14 8 views
4

J'ai une ArrayList d'objets User. Maintenant, j'ai besoin de l'ArrayList des noms de ces utilisateurs seulement. Y at-il un moyen d'utiliser toString() sur ArrayList entier et le convertir en ArrayList de noms de chaînes plutôt que de le faire dans la boucle for? J'ai également écrasé toString dans la classe Utilisateur afin qu'il renvoie le nom de l'utilisateur, et j'ai essayé ArrayList <String> names = usersList.toString() mais cela n'a pas fonctionné.Conversion de ArrayList d'objets en ArrayList de ces objets Noms de chaînes en Java

Répondre

5

Le Object#toString() renvoie String, et non un ArrayList. C'est ton problème. Vous avez vraiment besoin de boucler dessus. Il n'y a absolument aucune raison pour une aversion contre le bouclage. Il suffit de le cacher dans une méthode utilitaire si le code vous tracasse en quelque sorte;)


Avec Java 8, vous pouvez utiliser des expressions lambda, des cours d'eau, et les références de méthode pour simplifier votre code.

Voici

List<User> users = getItSomehow(); 
List<String> names = new ArrayList<String>(); 
for (User user : users) { 
    names.add(user.getName()); 
} 

peut alors être raccourcies à aimer

List<User> users = getItSomehow(); 
List<String> names = users.stream().map(User::getName).collect(Collectors.toList()); 

Par ailleurs, vous pouvez également mettre le for en une seule ligne:

for (User user : users) names.add(user.getName()); 

Il peut howev ne pas être directement compréhensible pour les débutants.

+0

BalusC: I mis à jour votre réponse et ajouté l'implémentation Java 8. A l'origine, il avait l'une des spécifications proposées pour ajouter des fermetures et des expressions lambda à Java 7 qui a changé de manière significative lorsqu'il a finalement été introduit dans Java 8. – Behrang

+0

@Behrang: oui, déjà remarqué et corrigé le style et la faute de frappe. – BalusC

0
public ArrayList<String> toStringList(Collection<MyObject> objectList) 
{ 
    ArrayList<String> stringList = new ArrayList<String>(); 

    for(MyObject myobj : objectList) { 
     stringList.add(myobj.toString()); 
    } 

    return stringList; 
} 

... 

ArrayList<String> myStringList = toStringList(objectList); 

Là. Une ligne, et vous pouvez le réutiliser avec n'importe quelle collection d'objets que vous avez dans le futur.

+0

J'ai mentionné que je me demandais si c'est possible sans utiliser pour la boucle, quelque chose comme stringList.addAll (objectList.toString()) – Mike55

+1

@ Mike55 Pourquoi éviter la boucle for? Même si vous écrivez ceci de telle sorte que vous n'utilisez pas de boucle for, en utilisant un appel de bibliothèque comme Goyave, à un moment donné, un morceau de code doit toujours visiter chaque élément de la liste pour le transformer –

7

Vous pouvez le faire en utilisant le Google Collections API:

List<User> userList = ...; 
List<String> nameList = Lists.transform(userList, new Function<User, String>() { 
    public String apply(User from) { 
     return from.toString(); // or even from.getName(); 
    } 
}); 

La bibliothèque a été renommé goyave.


Avec Java 8, en utilisant les flux et les références de la méthode que vous pouvez maintenant réaliser la même chose, même sans utiliser Goyave:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.stream.Collectors; 

class User { 

    private String name; 

    public User() { 
    } 

    public User(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

public class App { 
    public static void main(String[] args) { 
     List<User> users = new ArrayList<>(Arrays.asList(
       new User("Alan Turing"), 
       new User("John von Neumann"), 
       new User("Edsger W Dijkstra") 
     )); 

     List<String> names = users 
       .stream() 
       .map(User::getName) 
       .collect(Collectors.toList()); 

     System.out.println(names); 
    } 
} 
+2

Peut être raccourci à 'List nameList = Lists.transform (userList, Functions.toStringFunction());', tant que vous vous en tenez à 'toString' (au lieu du' getName' suggéré). – whiskeysierra

+0

Comment faire pour le même pour 'ArrayList à ArrayList ' –

+1

@Subra: 'ArrayList stringList = ...; ArrayList objectArrayList = Lists.transform (stringList, nouvelle fonction () { public Object [] appliquer (String à partir) {return new Object [] {} de;} }); ' – Behrang

1

En un mot: Non, ce que vous avez besoin est une fonction map, qui vous n'avez pas en Java (encore, comme le signale BalusC). Vous pouvez écrire vous-même quelque chose de similaire, mais vous finirez par parcourir chaque élément de votre liste.