Qual é a maneira mais fácil / mais curta de converter um Java 8 Stream
em uma matriz?
java
arrays
java-8
java-stream
MC Emperor
fonte
fonte
Respostas:
O método mais fácil é usar o
toArray(IntFunction<A[]> generator)
método com uma referência de construtor de matriz. Isso é sugerido na documentação da API do método .O que ele faz é encontrar um método que aceita um número inteiro (o tamanho) como argumento e retorna a
String[]
, que é exatamente o que (uma das sobrecargas de)new String[]
faz.Você também pode escrever o seu
IntFunction
:O objetivo do
IntFunction<A[]> generator
é converter um número inteiro, o tamanho da matriz, em uma nova matriz.Código de exemplo:
Impressões:
fonte
toArray(sz -> new String[sz])
isso, então não tenho certeza de que se possa realmente dizer qual deve ou deve ser a solução.sz -> new String[sz]
uma nova função onde, como a referência do construtor, não. Depende de quanto você valoriza a Garbage Collection Churn, eu acho.private
método novo, que não pode causar rotatividade, e as duas versões precisam criar um novo objeto. Uma referência cria um objeto que aponta diretamente para o método de destino; um lambda cria um objeto que aponta para o geradoprivate
. Uma referência a um construtor ainda deve ter um desempenho melhor por falta de indireção e otimização mais fácil da VM, mas a agitação não tem nada a ver com isso.Se você deseja obter uma matriz de entradas, com valores de 1 a 10, de um Stream, há o IntStream à sua disposição.
Aqui, criamos um Stream com o método Stream.of e convertemos um Stream em um IntStream usando um mapToInt. Em seguida, podemos chamar o método toArray do IntStream.
Aqui está a mesma coisa, sem o Stream, usando apenas o IntStream
fonte
Você pode converter um fluxo java 8 em uma matriz usando este bloco de código simples:
Mas vamos explicar mais, primeiro, vamos criar uma lista de strings preenchidas com três valores:
Crie um fluxo a partir da matriz fornecida:
agora podemos executar algumas operações nesse fluxo Ex:
e, finalmente, converta-o em uma matriz java 8 usando estes métodos:
Método 1-Classic (interface funcional)
Expressão 2 -ambda
3- Referência do método
Referência de método Explicação:
É outra maneira de escrever uma expressão lambda que é estritamente equivalente à outra.
fonte
Converta o texto na matriz de cadeias onde separa cada valor por vírgula e apara todos os campos, por exemplo:
fonte
Você pode criar um coletor personalizado que converte um fluxo em matriz.
e um uso rápido
fonte
Collectors.groupingBy
para que eu pudesse mapear algum atributo para matrizes de objetos por valor de atributo. Essa resposta me dá exatamente isso. Também @DidierL.Usar o
toArray(IntFunction<A[]> generator)
método é realmente uma maneira muito elegante e segura de converter (ou mais corretamente, coletar) um fluxo em uma matriz do mesmo tipo do fluxo.No entanto, se o tipo da matriz retornada não for importante, o simples uso do
toArray()
método será mais fácil e mais curto. Por exemplo:fonte
fonte
Experimente online: https://repl.it/@SmaMa/Stream-to-array
fonte
fonte
Você pode fazê-lo de várias maneiras. Todas as formas são tecnicamente iguais, mas o uso do Lambda simplificaria parte do código. Digamos que inicializamos uma Lista primeiro com String, chame-a de pessoas.
Agora você pode usar uma das seguintes maneiras.
Usando a expressão Lambda para criar um novo StringArray com tamanho definido.
String [] stringArray = stream.toArray (tamanho-> novo String [tamanho]);
Usando a referência do método diretamente.
String [] stringArray = stream.toArray (String [] :: new);
fonte