Hay muchas cosas nuevas útiles en Java 8. Por ejemplo, puedo iterar con una secuencia sobre una lista de objetos y luego sumar los valores de un campo específico de las Objectinstancias de. P.ej
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Por lo tanto, estoy preguntando si hay alguna forma de construir un Stringque concatene la salida del toString()método de las instancias en una sola línea.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Supongamos que listcontiene números enteros 1, 2y 3, espero que concatenatedsea "123"o "1,2,3".
java-8
java-stream
mat_boy
fuente
fuente

Respuestas:
Una forma simple es agregar sus elementos de lista en un
StringBuilderTambién puedes probar:
Explicación: el mapa convierte la secuencia Integer en secuencia String, luego se reduce como concatenación de todos los elementos.
Nota: Esto es lo
normal reductionque se realiza en O (n 2 )Para obtener un mejor rendimiento, utilice a
StringBuilderomutable reductionsimilar a la respuesta de F. Böller.Ref: reducción de corriente
fuente
joinen el otro lado preasignaría una matriz individual lo suficientemente grande como para almacenar la cadena final antes de llenarla, convirtiéndola en O (n).list.stream().map(Object::toString).reduce("", String::concat). Usarmap e-> e.toString()es un poco redundante.Hay un colector
joiningen la API. Es un método estático enCollectors.No es perfecto debido a la llamada necesaria
toString, pero funciona. Son posibles diferentes delimitadores.fuente
import static java.util.stream.Collectors.joining;En caso de que alguien esté tratando de hacer esto sin Java 8, hay un buen truco. List.toString () ya devuelve una colección que se ve así:
[1,2,3]
Dependiendo de sus requisitos específicos, esto se puede procesar posteriormente a lo que desee siempre que los elementos de su lista no contengan [] o,.
Por ejemplo:
o si sus datos pueden contener corchetes esto:
te dará un resultado bastante razonable.
Se puede crear un elemento de matriz en cada línea de esta manera:
Utilicé esta técnica para hacer información sobre herramientas html de una lista en una aplicación pequeña, con algo como:
Si tiene una matriz, comience con Arrays.asList (list) .toString () en su lugar
Reconoceré totalmente el hecho de que esto no es óptimo, pero no es tan ineficiente como podría pensar y es bastante sencillo de leer y comprender. Sin embargo, es bastante inflexible; en particular, no intente separar los elementos con replaceAll si sus datos pueden contener comas y use la versión de subcadena si tiene corchetes en sus datos, pero para una matriz de números es más o menos Perfecto.
fuente
Listque no aplique la estructura detoString().AbstractCollectionsin embargo, usa esta estructura por defecto, y creo que todas lasListimplementaciones de propósito general en Java SE también lo hacen. Como ejemplo de uno que no lo hace,org.springframework.util.AutoPopulatingListen la primavera no implementatoString()y así volvería por ejemplo "org.springframework.util.AutoPopulatingList@170a1".Arrays.toString()sería una mejor opción queArrays.asList(list).toString(), ya que está definido para devolver una cadena equivalente, es más conciso y no requiere la creación de objetos adicionales.Las otras respuestas están bien. Sin embargo, también puede pasar Collectors.toList () como parámetro a Stream.collect () para devolver los elementos como ArrayList.
fuente
System.out.print(ln)(list)usará eltoString()método de los elementos para imprimir la lista. Entonces, este fragmento de código solo está repitiendo lo que sucede dentro de latoStringLista.StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
fuente
Hay un método en la API de cadena para esos casos de uso de "lista de cadenas de unión", ni siquiera necesita Stream.
fuente
O
Este enfoque también le permite crear un resultado de cadena a partir de una lista de objetos Ejemplo
Aquí la función reducir le permite tener un valor inicial al que desea agregar una nueva cadena Ejemplo:
fuente
Probar ambos enfoques sugeridos en Shail016 y la respuesta bpedroso ( https://stackoverflow.com/a/24883180/2832140 ), el
StringBuilder+ simpleappend(String)dentro de unforbucle, parece ejecutarse mucho más rápido quelist.stream().map([...].Ejemplo: este código recorre una
Map<Long, List<Long>>compilación de una cadena json, usandolist.stream().map([...]:En mi máquina virtual de desarrollo, junit generalmente demora entre 0.35 y 1.2 segundos para ejecutar la prueba. Si bien, utilizando este código siguiente, tarda entre 0,15 y 0,33 segundos:
fuente
¿Podemos probar esto?
fuente
fuente
Lista un soloStringy separa cada elemento con una coma (,).Voy a usar la API de secuencias para convertir una secuencia de enteros en una sola cadena. El problema con algunas de las respuestas proporcionadas es que producen un tiempo de ejecución O (n ^ 2) debido a la construcción de cadenas. Una mejor solución es usar un StringBuilder y luego unir las cadenas como el paso final.
Puede llevar este proceso un paso más allá al convertir la colección de objetos en una sola cadena.
fuente
Con Java 8+
No es el más eficiente, pero es una solución con una pequeña cantidad de código.
fuente
Además, puedes hacer así.
fuente