Como a classificação com o java 8 stream funciona sob o capô?

10

Quando ligo, Stream.sort(..)existe uma nova matriz de elementos criada e o fluxo itera sobre a matriz classificada criada recentemente?

Em outras palavras, como o Java 8 Stream se sortcomporta?

InformedA
fonte
Por que recebo uma votação negativa com esta pergunta ???
InformedA
2
Sua pergunta é razoável e não merece votos negativos. Seus comentários sobre a resposta de amon , no entanto ... ugh: |
Andres F.
@AndresF. A votação veio antes mesmo de eu fazer esse comentário. É uma das razões pelas quais fiquei muito chateado.
InformedA
Os comentários não são motivo para voto negativo, de qualquer maneira. A questão tem mérito próprio e é válida na minha opinião. Eu votei nele.
Andres F.

Respostas:

10

Você pode usar o grepcode.com para pesquisar o código da biblioteca padrão Java (e algumas outras bibliotecas). Infelizmente, o código de implementação do fluxo é bastante abstrato. Um bom ponto de partida é a java.util.stream.SortedOpsclasse interna que transforma um fluxo em um fluxo classificado.

A implementação atual (usada para fluxos de contêineres de bibliotecas padrão) o torna inoperante se o fluxo já estiver classificado, usa uma matriz se o tamanho do fluxo for conhecido ( SizedRefSortingSink) ou acumula todos os elementos em um ArrayList se o tamanho for desconhecido ( RefSortingSink).

Obviamente, esses detalhes de implementação podem mudar com qualquer versão, mas as considerações fundamentais são universais: classificar um fluxo é necessariamente uma operação ágil / de bloqueio e classificar um fluxo infinito não é significativo. Isso significa que a classificação de um fluxo não será útil se você usar fluxos porque eles podem ser preguiçosos, mas você ainda obtém a sintaxe conveniente do fluxo.

Outros fluxos terão que fornecer sua própria implementação Stream.sorted(), o que provavelmente será semelhante.

amon
fonte
1
@InformedA Eu não quero sugerir que lambdas ou córregos sejam “besteiras sob o capô”. Ambos são incrivelmente convenientes, mesmo que os detalhes sobre fluxos sejam extraordinariamente complexos em comparação com outros conceitos de Java. Se você deseja manter sua noção pré-concebida de que essas ferramentas são inúteis ou prejudiciais, você está se limitando desnecessariamente.
amon
1
@amon - acordado, mais fluxos fornecem a possibilidade de rolar implementações paralelas multicore sob o capô, sem alterar virtualmente a aplicação. E a complexidade da implementação do fluxo vem exatamente disso. Isso é muito mais do que apenas conveniência, é abstração correta. Para o OP - sugiro que você leia Mastering Lambdas ... se quiser entender por que lambdas e fluxos são muito mais que apenas recursos convenientes.
Yuri Steinschreiber
3
@InformedA: lambdas existem há 80 anos e existem em praticamente todas as linguagens de programação atuais. Os fluxos existem há 40 anos e da mesma forma existem em praticamente todas as estruturas de coleções convencionais. Eles podem ser chamados de coisas diferentes (iteradores, listas preguiçosas, enumeradores, enumeráveis), mas estão lá. Lambdas e listas preguiçosas são algumas das abstrações mais antigas e estáveis ​​que existem e sobreviveram a todas as novas modas, hype, paradigmas, movimentos, metodologia, tecnologia, linguagem, sistema operacional, estrutura, biblioteca e biblioteca lançadas nelas. Isso os faz valer uma olhada.
Jörg W Mittag
2
@InformedA Java, a linguagem de programação, é apenas uma abstração besteira do bytecode em execução na JVM. A própria JVM é apenas uma abstração de besteira escrita em C (ou C ++, eu esqueço). C e C ++ são apenas abstrações besteiras sobre a linguagem assembly. Até a própria linguagem assembly é uma abstração besteira sobre microcódigo, que também é uma abstração besteira sobre circuitos (ok, eu posso estar perdendo algumas etapas no meio). Você poderia dizer que tudo o que é útil no software é uma "abstração de besteira" sobre outra coisa.
Andres F.
3
@InformedA Meu conselho sincero é que você tente aprender uma linguagem mais orientada para a programação funcional do que Java. Mesmo se você nunca usá-lo para seu trabalho do dia, você vai ganhar uma compreensão de linguagens de programação e suas escolhas de design que irá ajudá-lo com Java :)
Andres F.