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?

Foi útil?

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:

enter image description here

O que está por trás é isso:

  1. Genéricos Java não pode trabalhar com tipos primitivos:é possível ter apenas List<Integer> e Stream<Integer>, mas não List<int> e Stream<int>

  2. Quando o Coleções Java framework foi introduzido, ele foi introduzido apenas para aulas, então se você quiser ter um List de ints, você tem que envolvê-los para IntegerS.Isso é caro!

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top