studio - convertir un arreglo de int a string en java
¿Por qué no puedo mapear enteros a cadenas cuando se transmite desde una matriz? (5)
Este código funciona (tomado en el Javadoc):
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
.map(i -> i.toString())
.collect(Collectors.joining(", "));
Este no se puede compilar:
int[] numbers = {1, 2, 3, 4};
String commaSeparatedNumbers = Arrays.stream(numbers)
.map((Integer i) -> i.toString())
.collect(Collectors.joining(", "));
IDEA me dice que tengo una "cadena de tipo de retorno incompatible en expresión lambda".
Por qué ? ¿Y cómo arreglar eso?
Puede crear una secuencia de enteros usando Arrays.stream (int []), puede llamar a mapToObj
como mapToObj(Integer::toString)
.
String csn = Arrays.stream(numbers) // your numbers array
.mapToObj(Integer::toString)
.collect(Collectors.joining(", "));
Espero que esto ayude..
Si el propósito de esta muestra y pregunta es averiguar cómo asignar cadenas a una secuencia de entradas (por ejemplo, usar una secuencia de entradas para acceder a un índice en una matriz de cadenas), también puede usar el boxeo y luego convertirlo a un int (que luego permitiría acceder al índice de la matriz).
int[] numbers = {0, 1, 2, 3};
String commaSeparatedNumbers = Arrays.stream(numbers)
.boxed()
.map((Integer i) -> Integer.toString((int)i))
.collect(Collectors.joining(", "));
La llamada .boxed () convierte su IntStream (una secuencia de entradas primitivas) a una secuencia (una secuencia de objetos, a saber, objetos enteros) que luego aceptará la devolución de un objeto (en este caso, un objeto String) de tu lambda Aquí solo se trata de una representación de cadena del número para fines de demostración, pero podría ser igual de fácil (y más práctico) que cualquier objeto de cadena, como el elemento de una matriz de cadena como se mencionó anteriormente.
Solo pensé que ofrecería otra posibilidad. En la programación, siempre hay múltiples formas de realizar una tarea. Conozca todos los que pueda, luego elija el que mejor se adapte a la tarea en cuestión, teniendo en cuenta los problemas de rendimiento, la intuición, la claridad del código, sus preferencias en el estilo de codificación y la mayor auto-documentación.
Feliz codificación!
Sin boxeo, AFAIK, y sin explosión de pequeñas cadenas añadidas al montón:
public static void main(String[] args) {
IntStream stream = IntStream.of(1, 2, 3, 4, 5, 6);
String s = stream.collect(StringBuilder::new, (builder, n) -> builder.append('','').append(n), (x, y) -> x.append('','').append(y)).substring(1);
System.out.println(s);
}
Arrays.stream(int[])
crea un IntStream
, no un Stream<Integer>
. Por lo tanto, debe llamar a mapToObj
lugar de solo al map
, cuando se mapToObj
un int
a un objeto.
Esto debería funcionar como se esperaba:
String commaSeparatedNumbers = Arrays.stream(numbers)
.mapToObj(i -> ((Integer) i).toString()) //i is an int, not an Integer
.collect(Collectors.joining(", "));
que también puedes escribir:
String commaSeparatedNumbers = Arrays.stream(numbers)
.mapToObj(Integer::toString)
.collect(Collectors.joining(", "));
Arrays.stream(numbers)
crea un IntStream
bajo el capó y la operación de mapa en un IntStream
requiere un IntUnaryOperator
(es decir, una función int -> int
). La función de mapeo que desea aplicar no respeta este contrato y, por lo tanto, el error de compilación.
Arrays.asList(...).stream()
llamar a boxed()
antes para obtener un Stream<Integer>
(esto es lo que Arrays.asList(...).stream()
devuelve). Luego simplemente llame al map
como lo hizo en el primer fragmento.
Tenga en cuenta que si necesita un boxed()
seguido de un map
, probablemente quiera usar mapToObj
directamente.
La ventaja es que mapToObj
no requiere mapToObj
cada valor int
en un objeto Integer
; dependiendo de la función de mapeo que aplique por supuesto; así que iría con esta opción, que también es más corta de escribir.