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 Object
instancias 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 String
que 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 list
contiene números enteros 1
, 2
y 3
, espero que concatenated
sea "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
StringBuilder
Tambié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 reduction
que se realiza en O (n 2 )Para obtener un mejor rendimiento, utilice a
StringBuilder
omutable reduction
similar a la respuesta de F. Böller.Ref: reducción de corriente
fuente
join
en 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
joining
en 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
List
que no aplique la estructura detoString()
.AbstractCollection
sin embargo, usa esta estructura por defecto, y creo que todas lasList
implementaciones de propósito general en Java SE también lo hacen. Como ejemplo de uno que no lo hace,org.springframework.util.AutoPopulatingList
en 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 latoString
Lista.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 unfor
bucle, 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
List
a un soloString
y 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