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[])

Respostas:


9

Por que não

IntStream.range(0, shortarray.length)
         .mapToObj(s -> shortarray[s])
         .collect(Collectors.toList());

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).


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.