Usando Streams com tipos de dados primitivos e wrappers correspondentes
-
21-12-2019 - |
Pergunta
Enquanto brincava com a API Streams do Java8, me deparei com o seguinte:
Para converter uma matriz de objetos de classe wrapper primitivos em um Stream
Eu só tenho que ligar Stream.of(array)
.Mas para converter um array de tipos de dados primitivos, preciso chamar .of(array)
da classe de fluxo correspondente do wrapper (classe) (<-- isso parece bobo).
Um exemplo:
final Integer[] integers = {1, 2, 3};
final int[] ints = {1, 2, 3};
Stream.of(integers).forEach(System.out::println); //That works just fine
Stream.of(ints).forEach(System.out::println); //That doesn't
IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead
Minhas perguntas):Por que é isso?Isso se correlaciona com, por ex.o comportamento de Arrays.asList()
que também funciona apenas para matrizes de classe wrapper?
Solução
A estrutura de fluxo Java 8 tem um genérico Stream<T>
para objetos como elementos e três fluxos primitivos IntStream
, LongStream
, DoubleStream
para as três primitivas principais.Se você trabalha com primitivas, use uma dessas últimas, no seu caso IntStream
.
Veja a foto:
O que está por trás é isso:
Genéricos Java não pode trabalhar com tipos primitivos:é possível ter apenas
List<Integer>
eStream<Integer>
, mas nãoeList<int>
Stream<int>
Quando o Coleções Java framework foi introduzido, ele foi introduzido apenas para aulas, então se você quiser ter um
List
deint
s, você tem que envolvê-los paraInteger
S.Isso é caro!Quando o Fluxos Java estrutura foi introduzida, eles decidiram contornar essa sobrecarga e em paralelo com os fluxos "orientados a classes" (usando o mecanismo genérico), eles introduziram três conjuntos extras de todas as funções da biblioteca, projetados especificamente para os tipos primitivos mais importantes:
int
,long
,double
.
E veja também uma explicação maravilhosa aqui: https://stackoverflow.com/a/22919112/2886891