Liste de conversion<Integer> Liste<String>
J'ai une liste d'entiers, List<Integer>
et je voudrais convertir tous les entiers d'objets dans les Cordes, donc de finir avec un nouveau List<String>
.
Naturellement, j'ai pu créer un nouveau List<String>
et boucle à travers la liste d'appel String.valueOf()
pour chaque entier, mais je me demandais si il y avait une meilleure (lire: plus automatique) moyen de le faire?
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, itérer et instancier est la seule façon de le faire. Quelque chose comme (pour les autres potentiels de l'aide, car je suis sûr que vous savez comment le faire):
À l'aide de Google Collections de Goyave-Projet, vous pouvez utiliser le
transform
méthode dans le Listes classeLa
List
retourné partransform
est un vue sur la liste de sauvegarde - de la transformation sera appliquée sur chaque accès à la transformée de liste.Être conscient que
Functions.toStringFunction()
va jeter unNullPointerException
lorsqu'il est appliqué à la valeur null, donc à n'utiliser que si vous êtes sûr que votre liste ne contiendra la valeur null.new ArrayList<>(Lists.transform(integers, Functions.toStringFunction()))
au lieu de l'éviter,Lists.transform(listOfStrings, Ints.stringConverter());
Solution pour Java 8. Un peu plus de temps que la Goyave une, mais au moins vous n'avez pas à installer une bibliothèque.
toString
exemple, il finit par être plus courte pour les conversions non pris en charge par la Goyave de la bibliothèque de Fonctions. Les Fonctions personnalisées sont toujours faciles, mais il est nettement plus de code que ce Java 8 fluxCe que vous faites est très bien, mais si vous sentez le besoin de "Java-it-up", vous pourriez utiliser un Transformateur et la recueillir méthode de Apache Commons, par exemple:
..et puis..
La source pour la Chaîne.valueOf montre ceci:
Pas que cela importe beaucoup, mais je voudrais utiliser toString.
Au lieu de l'aide de la Chaîne.valueOf je ne l'utiliserais .toString(); il évite certains de l'auto de boxe décrite par @johnathan.hollande
La javadoc dit que valueOf renvoie la même chose que Entier.toString().
Voici un one-liner solution sans tricher avec un non-JDK bibliothèque.
Une autre Solution à l'aide de Goyave et de Java 8
Pas de base de Java, et pas des génériques identifiés, mais la populaire Jakarta commons collections de la bibliothèque a quelques abstractions utiles pour ce genre de tâche. Plus précisément, ont un coup d'oeil à la collecte des méthodes sur
CollectionUtils
Quelque chose à considérer si vous êtes déjà à l'aide de communes des collections dans votre projet.
Pour les personnes concernées au sujet de "boxe" dans jsight réponse: il n'y a aucun.
String.valueOf(Object)
est utilisé ici, et pas unboxing àint
est jamais réalisé.Si vous utilisez
Integer.toString()
ouString.valueOf(Object)
dépend de la façon dont vous souhaitez gérer les éventuelles valeurs null. Voulez-vous lancer une exception (probablement), ou "null" des Chaînes dans votre liste (peut-être). Si l'ancien, vous souhaitez lancer uneNullPointerException
ou d'un autre type?Aussi, une petite faille dans jsight réponse:
List
est une interface, vous ne pouvez pas utiliser l'opérateur de nouveau sur elle. Je serais probablement utiliser unjava.util.ArrayList
dans ce cas, surtout depuis que nous savons à l'avant combien de temps la liste est susceptible d'être.@Jonathan: j'ai peut être tort, mais je crois que Chaîne de caractères.valueOf() dans ce cas, appelez la Chaîne.valueOf(Objet) de la fonction plutôt que de sortir en boîte de Chaîne.valueOf(int). Chaîne de caractères.valueOf(Objet) retourne "null" si elle est nulle ou des appels de l'Objet.toString() si la non-nulle, ce qui ne devrait pas impliquer de boxe (bien que, évidemment, l'instanciation de nouveaux objets de chaîne est impliqué).
Je pense que l'utilisation de l'Objet.toString() pour toute autre fin que la mise au point 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 null). Les développeurs sont libres de modifier le comportement de la méthode toString() sans aucun avertissement, y compris les méthodes toString() les méthodes de toutes les classes de la bibliothèque standard.
Ne vous inquiétez pas sur les problèmes de performance causés par le boxing/unboxing processus. Si la performance est critique, il suffit d'utiliser un tableau. Si c'est vraiment essentiel, ne pas utiliser Java. Tente de déjouer la JVM ne fera que conduire à chagrin d'amour.
Une réponse pour experts seulement:
String
) partagent le même support de tableau (à partir deall
), il en va de fait être vraiment efficace en terme de mémoire, ce qui serait important pour les performances à long terme. Sauf si vous voulez garder l'un des éléments de cours...Lambdaj permet de le faire dans un très simple et très lisible. Par exemple, supposons que vous disposez d'une liste d'Entier et que vous souhaitez les convertir dans la représentation de Chaîne vous pouvez écrire quelque chose comme ça;
Lambdaj applique la fonction de conversion seulement alors que vous êtes en itérant sur le résultat.
Vous ne pouvez pas éviter la "boxe-dessus de la tête; Java est faux générique conteneurs ne peuvent stocker des Objets, de sorte que votre ints doit être mis en boîte en nombres Entiers. En principe, il pourrait éviter les humbles de l'Objet en Entier (car il est inutile, parce que l'Objet est assez bon pour les deux Cordes.valueOf et de l'Objet.toString) mais je ne sais pas si le compilateur est assez intelligent pour le faire. La conversion de la Chaîne de l'Objet doit être plus ou moins no-op, donc je serais pas enclin à s'inquiéter à ce propos.
Juste pour le fun, une solution à l'aide de la jsr166y fork-join cadre dans JDK7.
(Avertissement: ne Pas compilé. Spec n'est pas finalisé. Etc.)
Peu de chances d'être JDK7 est un peu de l'inférence de type et de syntaxe de sucre pour faire que withMapping appeler moins verbeux:
C'est un truc à faire, je ne voudrais pas utiliser une bibliothèque externe (il va provoquer une dépendance dans votre projet, que vous avez probablement n'avez pas besoin).
Nous avons une classe de méthodes statiques spécialement pour faire ce genre de travaux. Parce que le code est si simple de nous laisser Hotspot ne l'optimisation pour nous. Cela semble être un thème récurrent dans mon code récemment: écriture très simple (simple) et le code de laisser Hotspot faire sa magie. Nous avons rarement des problèmes de performances autour de ce type de code - lorsqu'une nouvelle VM version vient vous obtenez tous les avantages de rapidité etc.
Autant que j'aime Jakarta collections, ils ne prennent pas en charge les Génériques et l'utilisation 1.4 comme l'écran LCD. Je me méfie de Google Collections parce qu'ils sont répertoriés comme l'Alpha niveau de soutien!
Nous pouvons utiliser l'itérateur pour atteindre le même.
À L'Aide De Flux :
Si disons résultat est une liste d'entiers (
List<Integer> result
) puis :L'un des moyens de le résoudre. Espérons que cette aide.
Je voulais juste carillon avec un orientée objet, la solution au problème.
Si vous modèle des objets du domaine, puis la solution est dans le domaine des objets. Le domaine ici est une Liste de nombres entiers pour lesquels nous voulons de la chaîne de valeurs.
Le plus simple serait de ne pas convertir la liste à tous.
Cela étant dit, afin de convertir sans avoir à les convertir, modifier l'original de la liste des Entiers de la Liste de Valeur, où la Valeur ressemble à quelque chose comme ça...
Ce sera plus rapide et prendre moins de mémoire que la copie de la Liste.
Bonne Chance!