¿Cómo convertir short [] en List <Short> en Java con streams?

8

Pensé que podría extrapolar de esta pregunta pero no puedo

Por supuesto que puedo hacer

short[] shortarray = {0,1,2};
List<Short> shortList = new ArrayList<Short>();
for (Short s : shortarray) {
    shortList.add(s);
}

Pero me pregunto cómo hacerlo con transmisiones.

List<Short> shortList = Arrays.stream(shortarray).boxed()
                              .collect(Collectors.toList());

no funciona, por ejemplo, pero produce The method stream(T[]) in the type Arrays is not applicable for the arguments (short[])

mirar
fuente

Respuestas:

9

Por qué no

IntStream.range(0, shortarray.length)
         .mapToObj(s -> shortarray[s])
         .collect(Collectors.toList());
ernest_k
fuente
¿Por qué mapToObjy no mapToInt(o simple map)? usar un en IntStreamlugar de Stream<Integer>debería ser preferible en casi todas las situaciones en las que se manejan entradas primitivas o cortos.
Polygnome
mapToIntfinalmente recoger una List<Integer>instancia, no un List<Short>.
Sachith Dickwella
1
@Polygnome Creo que tienes un punto, pero el OP está recopilando elementos en un List<Short>, por lo que no se puede evitar el boxeo.
ernest_k
1
@Polygnome "en casi todas las situaciones", excepto cuando la tarea es producir a List<Short>. No es que alguna vez encontré tal necesidad en la vida real ...
Holger
1

En cuanto a por qué no funciona con un primitivo corto []:

no hay ningún tipo de secuencia de corto. Las secuencias solo funcionan para tipos no primitivos o con IntStream, LongStream y DoubleStream .

Para que funcione, tendría que convertir sus cortos a un tipo de datos con un Stream compatible, por ejemplo Short, o quizás int para un IntStream (consulte la respuesta de ernest_k).

lugiorgi
fuente
Sí, no puedes lanzarlo, pero puedes convertir cada entrada. Aclaré eso en una edición. Siento que el "por qué" también es importante para una respuesta y debería incluirse.
lugiorgi
0

Hay otra forma de convertir una matriz corta en una colección.

  1. Convertir corto a corto conjunto de objetos
  2. Use el método Arrays.asList para convertir Short [] en List y luego iterar sobre ellos usando streams.

Ver abajo el código de muestra,

Short[] shortarray = {0,1,2}; List<Short> shortList1 = Arrays.asList(shortarray); shortList1.stream().forEach(aShort -> {System.out.println(aShort);});

Espero que esto ayude.

Gracias Sandy

Arenoso
fuente
PO quiere convertir short[]noShort[]
Karthikeyan Vaithilingam
En realidad, la Arraysclase solo considera int, long, double o cualquier tipo de objeto como parámetros en este momento. Por lo tanto, la respuesta simple "no es posible" en este momento es tan corta como el parámetro del método de flujo de la clase Arrays. Nota: Mi opinión relacionada con el soporte de Arrays.stream param es válida hasta Java 1.8 desde mi revisión de documentación.
Sandy