Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

O que é mais performantico STREAM ou operações com Java puro

Venho do C# normalmente operações com a linguagem pura possui um ganho substancial em relação a essas que abstraem a operação, gostaria de saber se há alguma diferença de ganho de performance nesse tipo de uso, dei uma pesquisada, mas até agora nenhum material me convenceu.

1 resposta
solução!

Olá Eugenio! Tudo bem?

Essa é uma ótima pergunta e é algo que muitos desenvolvedores se perguntam ao começar a usar Streams e lambdas no Java. Vamos analisar a questão de performance entre operações com Streams e operações com Java puro.

  1. Streams:

    • Abstração e Legibilidade: Streams fornecem uma maneira mais declarativa de processar coleções de dados. Isso significa que você descreve o que quer fazer com os dados, em vez de como fazer.
    • Operações Encadeadas: Permitem encadear várias operações de maneira fluida e legível.
    • Paralelismo: Streams podem ser facilmente paralelizados usando parallelStream(), o que pode trazer ganhos de performance em operações que podem ser executadas em paralelo.

    Exemplo:

    List<String> nomes = Arrays.asList("Jacque", "Iasmin", "Paulo", "Rodrigo", "Nico");
    nomes.stream()
         .sorted()
         .limit(3)
         .filter(n -> n.startsWith("N"))
         .map(String::toUpperCase)
         .forEach(System.out::println);
    
  2. Java Puro:

    • Controle Fino: Usar loops e coleções diretamente pode oferecer mais controle sobre a execução e otimização específica.
    • Performance: Em alguns casos, operações com Java puro podem ser mais rápidas, especialmente para tarefas simples, pois evitam a sobrecarga da abstração dos Streams.

    Exemplo:

    List<String> nomes = Arrays.asList("Jacque", "Iasmin", "Paulo", "Rodrigo", "Nico");
    List<String> result = new ArrayList<>();
    for (String nome : nomes) {
        if (nome.startsWith("N")) {
            result.add(nome.toUpperCase());
        }
    }
    Collections.sort(result);
    for (int i = 0; i < Math.min(result.size(), 3); i++) {
        System.out.println(result.get(i));
    }
    

A performance pode variar dependendo do contexto:

  • Operações Simples: Para operações simples e pequenas coleções, a diferença de performance pode ser insignificante.
  • Operações Complexas: Para operações mais complexas ou grandes volumes de dados, Streams podem ser mais eficientes, especialmente se você utilizar parallelStream().
  • Overhead: Streams têm um overhead inicial devido à criação de objetos e à abstração, o que pode ser um fator em operações extremamente simples.

De maneira geral, se pensamos em legibilidade e manutenibilidade, Streams tornam geralmente o código mais legível e fácil de manter. Agora, para a maioria dos casos, a diferença de performance não é significativa. No entanto, se a performance for crítica, vale a pena fazer benchmarks específicos para o seu caso de uso.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.