Como converter short [] em List <Short> em Java com fluxos?

8

Imaginei que poderia extrapolar a partir desta pergunta, mas não posso

Eu posso fazer

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

Mas eu estou querendo saber como fazê-lo com fluxos.

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

não funciona, por exemplo, mas produz The method stream(T[]) in the type Arrays is not applicable for the arguments (short[])

par
fonte

Respostas:

9

Por que não

IntStream.range(0, shortarray.length)
         .mapToObj(s -> shortarray[s])
         .collect(Collectors.toList());
ernest_k
fonte
Por que mapToObje não mapToInt(ou simples map)? usar um em IntStreamvez de Stream<Integer>deve ser preferível em quase todas as situações em que se está lidando com ints ou shorts primitivos.
Polygnome
mapToIntfinalmente colete uma List<Integer>instância, não a List<Short>.
Sachith Dickwella
1
@ Polygnome Eu acredito que você tem razão, mas o OP está coletando elementos em um List<Short>, então o boxe não pode ser evitado.
ernest_k
1
@ Polygnome “em quase todas as situações”, exceto quando a tarefa é produzir a List<Short>. Não que eu já tenha encontrado essa necessidade na vida real ...
Holger
1

Por que ele não funciona com um curto primitivo []:

não há um tipo de fluxo curto. Os fluxos funcionam apenas para tipos não primitivos ou com IntStream, LongStream e DoubleStream .

Para funcionar, você teria que converter seus shorts em um tipo de dados com um Stream compatível, por exemplo Short, ou talvez em int para um IntStream (consulte a resposta de ernest_k).

lugiorgi
fonte
Sim, você não pode convertê-lo, mas pode converter cada entrada. Esclareci isso em uma edição. Eu sinto que o "porquê" também é importante para uma resposta e deve ser incluído.
lugiorgi
0

Há outra maneira de converter uma matriz curta em uma coleção.

  1. Converter curto em array de objetos Short
  2. Use o método Arrays.asList para converter Short [] em List e, em seguida, itere sobre eles usando fluxos.

Veja abaixo o código de exemplo,

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

Espero que isto ajude.

Obrigado Sandy

Sandy
fonte
OP quer converter short[]nãoShort[]
Karthikeyan Vaithilingam
Na verdade, a Arraysclasse considera apenas int, long, double ou qualquer tipo de objeto como parâmetro no momento. Portanto, a resposta simples "não é possível" no momento é tão curta quanto o parâmetro do método de fluxo da classe Arrays. Nota: Minha opinião enviada ao suporte paramétrico Arrays.stream é válida até o java 1.8 da revisão do meu documento.
Sandy