Utiliser Java 8 pour convertir une liste d’objects en une chaîne obtenue à partir de la méthode toSsortingng ()

Il y a beaucoup de nouvelles choses utiles dans Java 8. Par exemple, je peux effectuer une itération avec un stream sur une liste d’objects, puis additionner les valeurs d’un champ spécifique des instances de l’ Object . Par exemple

 public class AClass { private int value; public int getValue() { return value; } } Integer sum = list.stream().mapToInt(AClass::getValue).sum(); 

Par conséquent, je vous demande s’il existe un moyen de générer une Ssortingng qui concatène la sortie de la toSsortingng() partir des instances d’une seule ligne.

 List list = ... Ssortingng concatenated = list.stream().... //concatenate here with toSsortingng() method from java.lang.Integer class 

Supposons que cette list contienne des entiers 1 , 2 et 3 , je pense que concatenated est "123" ou "1,2,3" .

Un moyen simple consiste à append vos éléments de liste dans un SsortingngBuilder

  List list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); StringBuilder b = new StringBuilder(); list.forEach(b::append); System.out.println(b); 

vous pouvez également essayer:

 Ssortingng s = list.stream().map(e -> e.toSsortingng()).reduce("", Ssortingng::concat); 

Explication: map convertit le stream entier en stream de chaîne, puis réduit sa taille en tant que concaténation de tous les éléments.

Note: Ceci est normal reduction qui effectue dans O (n 2 )

pour de meilleures performances, utilisez un SsortingngBuilder ou une mutable reduction similaire à la réponse de F. Böller.

 Ssortingng s = list.stream().map(Object::toSsortingng).collect(Collectors.joining(",")); 

Ref: Réduction de stream

Il y a un collecteur qui se joining à l’API. C’est une méthode statique dans les Collectors .

 list.stream ().map (i -> i.toSsortingng ()).collect (Collectors.joining (",")) 

Pas parfait à cause de l’appel nécessaire de toSsortingng , mais fonctionne. Différents délimiteurs sont possibles.

Juste au cas où quelqu’un essaierait de le faire sans Java 8, il y a une très bonne astuce. List.toSsortingng () 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:

 list.toSsortingng().replace("[","").replace("]","") 

ou si vos données peuvent contenir des crochets:

 Ssortingng s=list.toSsortingng(); s = s.subssortingng(1,s.length()-1) 

vous obtiendrez une sortie assez raisonnable.

Un élément de tableau sur chaque ligne peut être créé comme ceci:

 list.toSsortingng().replace("[","").replace("]","").replaceAll(",","\r\n") 

J’ai utilisé cette technique pour créer des info-bulles HTML à partir d’une liste dans une petite application, avec quelque chose comme:

 list.toSsortingng().replace("[","").replace("]","").replaceAll(",","
")

Si vous avez un tableau, commencez par Arrays.asList (list) .toSsortingng () à la place

Je suis tout à fait convaincu 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 sous-chaîne si vous avez des crochets dans vos données, mais pour un tableau de nombres parfait.

Les autres réponses sont bonnes. Toutefois, vous pouvez également transmettre Collectors.toList () en tant que paramètre à Stream.collect () pour renvoyer les éléments en tant que ArrayList.

 System.out.println( list.stream().map( e -> e.toSsortingng() ).collect( toList() ) ); 
 Ssortingng actual = list.stream().reduce((t, u) -> t + "," + u).get(); 
 List list = Arrays.asList("One", "Two", "Three"); list.stream() .reduce("", org.apache.commons.lang3.SsortingngUtils::join); 

Ou

 List list = Arrays.asList("One", "Two", "Three"); list.stream() .reduce("", (s1,s2)->s1+s2); 

Cette approche vous permet également de créer un résultat de chaîne à partir d’une liste d’objects. Exemple

 List list = Arrays.asList(w1, w2, w2); list.stream() .map(w->w.getSsortingngValue) .reduce("", org.apache.commons.lang3.SsortingngUtils::join); 

Ici, la fonction réduire vous permet d’avoir une valeur initiale à laquelle vous voulez append une nouvelle chaîne. Exemple:

  List errors = Arrays.asList("er1", "er2", "er3"); list.stream() .reduce("Found next errors:", (s1,s2)->s1+s2); 

Testant les deux approches suggérées dans Shail016 et bpedroso answer ( https://stackoverflow.com/a/24883180/2832140 ), le simple SsortingngBuilder + append(Ssortingng) dans une boucle for semble s’exécuter beaucoup plus rapidement que list.stream().map([...] .

Exemple: Ce code parcourt une Map> construit une chaîne json, en utilisant list.stream().map([...] :

 if (mapSize > 0) { SsortingngBuilder sb = new SsortingngBuilder("["); for (Map.Entry> entry : threadsMap.entrySet()) { sb.append("{\"" + entry.getKey().toSsortingng() + "\":["); sb.append(entry.getValue().stream().map(Object::toSsortingng).collect(Collectors.joining(","))); } sb.delete(sb.length()-2, sb.length()); sb.append("]"); System.out.println(sb.toSsortingng()); } 

Sur mon VM de développement, junit prend généralement entre 0.35 et 1.2 secondes pour exécuter le test. Alors que, en utilisant ce code suivant, il faut entre 0,15 et 0,33 seconde:

 if (mapSize > 0) { SsortingngBuilder sb = new SsortingngBuilder("["); for (Map.Entry> entry : threadsMap.entrySet()) { sb.append("{\"" + entry.getKey().toSsortingng() + "\":["); for (Long tid : entry.getValue()) { sb.append(tid.toSsortingng() + ", "); } sb.delete(sb.length()-2, sb.length()); sb.append("]}, "); } sb.delete(sb.length()-2, sb.length()); sb.append("]"); System.out.println(sb.toSsortingng()); } 

Pouvons-nous essayer ceci?

 public static void main(Ssortingng []args){ List ssortingngList = new ArrayList<>(); for(int i=0;i< 10;i++){ stringList.add(""+i); } String stringConcated = String.join(",", stringList); System.out.println(stringConcated); } 

Avec Java 8+

 Ssortingng s = Arrays.toSsortingng(list.stream().toArray(AClass[]::new)); 

Pas le plus efficace, mais c’est une solution avec une petite quantité de code.

En outre, vous pouvez faire comme ça.

  List list = Arrays.asList("One", "Two", "Three"); Ssortingng result = Ssortingng.join(", ", list); System.out.println(result);