Il y a beaucoup de nouvelles choses utiles dans Java 8. Par exemple, je peux itérer avec un flux sur une liste d'objets, puis additionner les valeurs d'un champ spécifique des Object
instances de. Par exemple
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Ainsi, je demande s'il existe un moyen de construire un String
qui concatène la sortie de la toString()
méthode à partir des instances sur une seule ligne.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Supposons que cela list
contienne des entiers 1
, 2
et 3
, je suppose que concatenated
c'est "123"
ou "1,2,3"
.
java-8
java-stream
mat_boy
la source
la source
Réponses:
Une façon simple consiste à ajouter vos éléments de liste dans un
StringBuilder
vous pouvez également essayer:
Explication: la carte convertit le flux Integer en flux String, puis sa réduction en tant que concaténation de tous les éléments.
Remarque: c'est
normal reduction
ce qui fonctionne dans O (n 2 )pour de meilleures performances, utilisez un
StringBuilder
oumutable reduction
similaire à la réponse de F. Böller.Réf: Stream Reduction
la source
join
de l'autre côté, il faudrait préallouer un seul tableau suffisamment grand pour stocker la chaîne finale avant de la remplir, ce qui la rend O (n).list.stream().map(Object::toString).reduce("", String::concat)
. L'utilisationmap e-> e.toString()
est un peu redondante.Il y a un collecteur
joining
dans l'API. C'est une méthode statique dansCollectors
.Pas parfait à cause de l'appel nécessaire de
toString
, mais fonctionne. Différents délimiteurs sont possibles.la source
import static java.util.stream.Collectors.joining;
Juste au cas où quelqu'un essaierait de le faire sans java 8, il y a une très bonne astuce. List.toString () renvoie déjà une collection qui ressemble à ceci:
[1,2,3]
Selon vos besoins spécifiques, cela peut être post-traité à votre guise tant que vos éléments de liste ne contiennent pas [] ou,.
Par exemple:
ou si vos données peuvent contenir des crochets, ceci:
vous obtiendrez une sortie assez raisonnable.
Un élément de tableau sur chaque ligne peut être créé comme ceci:
J'ai utilisé cette technique pour créer des info-bulles html à partir d'une liste dans une petite application, avec quelque chose comme:
Si vous avez un tableau, commencez par Arrays.asList (list) .toString () à la place
Je suis totalement conscient du fait que ce n'est pas optimal, mais ce n'est pas aussi inefficace que vous pourriez le penser et c'est assez simple à lire et à comprendre. Il est cependant assez rigide - en particulier, n'essayez pas de séparer les éléments avec replaceAll si vos données peuvent contenir des virgules et utilisez la version de la sous-chaîne si vous avez des crochets dans vos données, mais pour un tableau de nombres, c'est à peu près parfait.
la source
List
n'applique pas la structure detoString()
.AbstractCollection
cependant, utilise cette structure par défaut, et je pense que toutes lesList
implémentations à usage général de Java SE le font également. À titre d'exemple de celui qui ne le fait pas,org.springframework.util.AutoPopulatingList
dans Spring ne l'implémente pastoString()
et retournerait donc par exemple "org.springframework.util.AutoPopulatingList@170a1
".Arrays.toString()
serait un meilleur choix queArrays.asList(list).toString()
, comme il est défini pour renvoyer une chaîne équivalente, il est plus concis et ne nécessite pas de création d'objet supplémentaire.Les autres réponses sont bonnes. Cependant, vous pouvez également passer Collectors.toList () en tant que paramètre à Stream.collect () pour renvoyer les éléments en tant que ArrayList.
la source
System.out.print
(ln),(list)
il utilisera latoString()
méthode des éléments pour imprimer la liste. Donc, ce morceau de code ne fait que répéter ce qui se passe dans latoString
liste.StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
la source
Il existe une méthode dans l'API String pour les cas d'utilisation de la "liste de chaînes de jonction", vous n'avez même pas besoin de Stream.
la source
Ou
Cette approche vous permet également de créer un résultat de chaîne à partir d'une liste d'objets Exemple
Ici, la fonction de réduction vous permet d'avoir une valeur initiale à laquelle vous souhaitez ajouter une nouvelle chaîne Exemple:
la source
Tester les deux approches suggérées dans Shail016 et bpedroso answer ( https://stackoverflow.com/a/24883180/2832140 ), le simple
StringBuilder
+append(String)
dans unefor
boucle, semble s'exécuter beaucoup plus rapidement quelist.stream().map([...]
.Exemple: Ce code parcourt
Map<Long, List<Long>>
une build une chaîne json, en utilisantlist.stream().map([...]
:Sur ma machine virtuelle de développement, junit prend généralement entre 0,35 et 1,2 seconde pour exécuter le test. Alors qu'en utilisant ce code suivant, cela prend entre 0,15 et 0,33 seconde:
la source
Pouvons-nous essayer cela.
la source
la source
List
à un seulString
et sépare chaque élément par une virgule (,
).Je vais utiliser l'API Streams pour convertir un flux d'entiers en une seule chaîne. Le problème avec certaines des réponses fournies est qu'elles produisent un runtime O (n ^ 2) en raison de la construction de String. Une meilleure solution consiste à utiliser un StringBuilder, puis à joindre les chaînes ensemble comme étape finale.
Vous pouvez pousser ce processus un peu plus loin en convertissant la collection d'objets en une seule chaîne.
la source
Avec Java 8+
Pas le plus efficace, mais c'est une solution avec une petite quantité de code.
la source
Vous pouvez aussi faire comme ça.
la source