J'ai une liste d'entiers List<Integer>
et j'aimerais convertir tous les objets entiers en chaînes, finissant ainsi avec un nouveau List<String>
.
Naturellement, je pourrais créer un nouveau List<String>
et faire une boucle dans la liste en appelant String.valueOf()
chaque entier, mais je me demandais s'il y avait une meilleure façon (lire: plus automatique ) de le faire?
java
string
collections
integer
ChrisThomas123
la source
la source
En utilisant Google Collections de Guava-Project , vous pouvez utiliser la
transform
méthode de la classe ListsLe
List
renvoyé partransform
est une vue sur la liste de sauvegarde - la transformation sera appliquée à chaque accès à la liste transformée.Sachez que
Functions.toStringFunction()
cela lèvera unNullPointerException
lorsqu'il est appliqué à null, donc ne l'utilisez que si vous êtes sûr que votre liste ne contiendra pas null.la source
Solution pour Java 8. Un peu plus longue que celle de Guava, mais au moins vous n'avez pas besoin d'installer de bibliothèque.
la source
toString
exemple, cela finit par être plus court pour les conversions non prises en charge par la bibliothèque de fonctions de Guava. Les fonctions personnalisées sont toujours faciles, mais c'est beaucoup plus de code que ce flux Java 8Ce que vous faites est bien, mais si vous ressentez le besoin de «Java-it-up», vous pouvez utiliser un Transformer et la méthode collect d' Apache Commons , par exemple:
..puis..
la source
La source de String.valueOf montre ceci:
Pas que cela compte beaucoup, mais j'utiliserais toString.
la source
Au lieu d'utiliser String.valueOf, j'utiliserais .toString (); cela évite une partie de la boxe automatique décrite par @ johnathan.holland
Le javadoc dit que valueOf renvoie la même chose que Integer.toString ().
la source
Voici une solution unique sans tricher avec une bibliothèque non-JDK.
la source
Une autre solution utilisant Guava et Java 8
la source
Pas le noyau Java, ni générique, mais la populaire bibliothèque de collections Jakarta commons a quelques abstractions utiles pour ce type de tâche. Plus précisément, jetez un œil aux méthodes de collecte sur
CollectionUtils
Quelque chose à considérer si vous utilisez déjà des collections communes dans votre projet.
la source
Aux personnes concernées par la "boxe" dans la réponse de jsight: il n'y en a pas.
String.valueOf(Object)
est utilisé ici, et aucun déballageint
n'est jamais effectué.Le fait que vous utilisiez
Integer.toString()
ouString.valueOf(Object)
dépend de la manière dont vous souhaitez gérer les valeurs nulles possibles. Voulez-vous lever une exception (probablement), ou avoir des chaînes «nulles» dans votre liste (peut-être). Si c'est le premier, voulez-vous lancer unNullPointerException
ou un autre type?De plus, un petit défaut dans la réponse de jsight:
List
c'est une interface, vous ne pouvez pas utiliser le nouvel opérateur dessus. J'utiliserais probablement unjava.util.ArrayList
dans ce cas, d'autant plus que nous savons à l'avance combien de temps la liste est susceptible d'être.la source
la source
@Jonathan: Je peux me tromper, mais je crois que String.valueOf () dans ce cas appellera la fonction String.valueOf (Object) plutôt que d'être encadré par String.valueOf (int). String.valueOf (Object) renvoie simplement "null" s'il est nul ou appelle Object.toString () s'il n'est pas nul, ce qui ne devrait pas impliquer de boxe (bien que l'instanciation de nouveaux objets chaîne soit évidemment impliquée).
la source
Je pense que l'utilisation d'Object.toString () à des fins autres que le débogage est probablement une très mauvaise idée, même si dans ce cas, les deux sont fonctionnellement équivalents (en supposant que la liste n'a pas de valeurs nulles). Les développeurs sont libres de modifier le comportement de toute méthode toString () sans aucun avertissement, y compris les méthodes toString () de toutes les classes de la bibliothèque standard.
Ne vous inquiétez même pas des problèmes de performances causés par le processus de boxe / déballage. Si les performances sont essentielles, utilisez simplement une baie. Si c'est vraiment critique, n'utilisez pas Java. Essayer de déjouer la JVM ne conduira qu'à un chagrin d'amour.
la source
Une réponse réservée aux experts:
la source
String
) partagera le même tableau de support (deall
), donc sera en fait vraiment assez efficace en mémoire, ce qui serait important pour les performances à long terme. A moins que vous ne vouliez garder un seul des éléments bien sûr ...Lambdaj permet de le faire d'une manière très simple et lisible. Par exemple, en supposant que vous ayez une liste d'entiers et que vous vouliez les convertir dans la représentation String correspondante, vous pourriez écrire quelque chose comme ça;
Lambdaj applique la fonction de conversion uniquement pendant que vous itérez sur le résultat.
la source
Vous ne pouvez pas éviter les "frais généraux de boxe"; Les faux conteneurs génériques de Java ne peuvent stocker que des objets, donc vos entiers doivent être encadrés dans des entiers. En principe, cela pourrait éviter le downcast d'Object en Integer (car c'est inutile, car Object est assez bon pour String.valueOf et Object.toString) mais je ne sais pas si le compilateur est assez intelligent pour le faire. La conversion de String en Object devrait être plus ou moins un no-op, donc je serais peu enclin à m'inquiéter à ce sujet.
la source
Nous pouvons utiliser l'itérateur pour réaliser la même chose.
la source
Utilisation des flux: si le résultat est une liste d'entiers (
List<Integer> result
), alors:Une des façons de le résoudre. J'espère que cela t'aides.
la source
Une solution légèrement plus concise en utilisant la méthode forEach sur la liste d'origine:
la source
Juste pour le plaisir, une solution utilisant le framework jsr166y fork-join qui devrait dans JDK7.
(Avertissement: non compilé. Les spécifications ne sont pas finalisées. Etc.)
Il est peu probable que JDK7 soit un peu d'inférence de type et de sucre syntaxique pour rendre l'appel withMapping moins verbeux:
la source
C'est une chose tellement basique à faire que je n'utiliserais pas de bibliothèque externe (cela entraînerait une dépendance dans votre projet dont vous n'avez probablement pas besoin).
Nous avons une classe de méthodes statiques spécialement conçues pour faire ce genre de travail. Parce que le code est si simple, nous laissons Hotspot faire l'optimisation pour nous. Cela semble être un thème dans mon code récemment: écrivez du code très simple (simple) et laissez Hotspot faire sa magie. Nous avons rarement des problèmes de performances autour d'un code comme celui-ci - lorsqu'une nouvelle version de VM arrive, vous bénéficiez de tous les avantages de vitesse supplémentaires, etc.
Même si j'aime les collections Jakarta, elles ne prennent pas en charge les génériques et utilisent la version 1.4 comme écran LCD. Je me méfie des collections Google car elles sont répertoriées comme niveau de support Alpha!
la source
Je voulais juste intervenir avec une solution orientée objet au problème.
Si vous modélisez des objets de domaine, la solution se trouve dans les objets de domaine. Le domaine ici est une liste d'entiers pour lesquels nous voulons des valeurs de chaîne.
Le moyen le plus simple serait de ne pas convertir du tout la liste.
Cela étant dit, pour convertir sans convertir, changez la liste d'origine des entiers en Liste de valeurs, où Value ressemble à quelque chose comme ça ...
Ce sera plus rapide et occupera moins de mémoire que la copie de la liste.
Bonne chance!
la source