{"id":15068747,"url":"https://github.com/digitalinnovationone/ganhando_produtividade_com_stream_api_java","last_synced_at":"2025-05-16T09:03:08.368Z","repository":{"id":183522385,"uuid":"670231801","full_name":"digitalinnovationone/ganhando_produtividade_com_Stream_API_Java","owner":"digitalinnovationone","description":"Este repositório contém o código-fonte do curso \"Ganhando Produtividade com Stream API Java\". O curso foi projetado para ajudar desenvolvedores Java a aproveitar ao máximo a poderosa Stream API introduzida no Java 8.","archived":false,"fork":false,"pushed_at":"2024-06-27T19:45:53.000Z","size":47,"stargazers_count":866,"open_issues_count":21,"forks_count":513,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-16T09:03:01.200Z","etag":null,"topics":["java17","java8","programacao-funcional"],"latest_commit_sha":null,"homepage":"https://web.dio.me/course/ganhando-produtividade-com-stream-api","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/digitalinnovationone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-24T15:23:02.000Z","updated_at":"2025-05-15T19:27:05.000Z","dependencies_parsed_at":"2025-01-03T05:13:08.118Z","dependency_job_id":null,"html_url":"https://github.com/digitalinnovationone/ganhando_produtividade_com_Stream_API_Java","commit_stats":{"total_commits":20,"total_committers":1,"mean_commits":20.0,"dds":0.0,"last_synced_commit":"456f10d8d2d45e8ec0a55f38c0853c43ded287ea"},"previous_names":["cami-la/ganhando_produtividade_com_stream_api_java","digitalinnovationone/ganhando_produtividade_com_stream_api_java"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalinnovationone%2Fganhando_produtividade_com_Stream_API_Java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalinnovationone%2Fganhando_produtividade_com_Stream_API_Java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalinnovationone%2Fganhando_produtividade_com_Stream_API_Java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalinnovationone%2Fganhando_produtividade_com_Stream_API_Java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digitalinnovationone","download_url":"https://codeload.github.com/digitalinnovationone/ganhando_produtividade_com_Stream_API_Java/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254501555,"owners_count":22081528,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java17","java8","programacao-funcional"],"created_at":"2024-09-25T01:39:05.154Z","updated_at":"2025-05-16T09:03:08.338Z","avatar_url":"https://github.com/digitalinnovationone.png","language":"Java","readme":"# Ganhando Produtividade com Stream API e Java\n\n- A Streams API traz uma nova opção para a manipulação de coleções em Java seguindo os princípios da programação funcional.\n- Stream, trata-se de uma poderosa solução para processar coleções de maneira declarativa, ao invés da tradicional e burocrática forma imperativa.\n\n```java\npublic class CarrinhoDeCompras {\n  //atributos\n  private List\u003cItem\u003e itemList;\n  //construtor\n  public CarrinhoDeCompras() {\n    this.itemList = new ArrayList\u003c\u003e();\n  }\n  \n  //método para calcular valor total dos itens sem utilizar o Stream API\n  public double calcularValorTotal() {\n    double valorTotal = 0d;\n    if (!itemList.isEmpty()) {\n      for (Item item : itemList) {\n        double valorItem = item.getPreco() * item.getQuant();\n        valorTotal += valorItem;\n      }\n      return valorTotal;\n    } else {\n      throw new RuntimeException(\"A lista está vazia!\");\n    }\n  }\n}\n```\n\n- Na forma imperativa, para realizar uma soma simples, por exemplo, o desenvolvedor tem que se preocupar não apenas com o que deve ser feito em cada elemento, isto é, com as regras associadas ao processamento dos elementos da lista, mas também com a maneira de realizar essa iteração.\n\n```java\npublic class CarrinhoDeCompras {\n  //atributos\n  private List\u003cItem\u003e itemList;\n  //construtor\n  public CarrinhoDeCompras() {\n    this.itemList = new ArrayList\u003c\u003e();\n  }\n  \n  //método para calcular valor total dos itens utilizando o Stream API\n  public double calcularValorTotal() {\n    if (itemList.isEmpty()) {\n      throw new RuntimeException(\"A lista está vazia!\");\n    }\n    return itemList.stream()\n        .mapToDouble(item -\u003e item.getPreco() * item.getQuant())\n        .sum();\n  }\n}\n```\n- Combinada com as Expressões Lambda e Method reference, eles proporcionam uma forma diferente de lidar com conjuntos de elementos, oferecendo ao desenvolvedor uma maneira simples e concisa de escrever código que resulta em facilidade de manutenção e paralelização sem efeitos indesejados em tempo de execução.\n- As operações na Stream API podem ser classificadas em duas categorias principais: \n1. Operações Intermediárias: são aquelas que retornam uma nova Stream e permitem encadear várias operações, formando um pipeline de processamento de dados. São elas:\n- `filter(Predicate\u003cT\u003e predicate)`: Filtra os elementos da Stream com base em um predicado. Retorna uma nova Stream contendo apenas os elementos que atendem ao critério do predicado.\nExemplo: ` stream.filter(n -\u003e n \u003e 5)`\n- `map(Function\u003cT, R\u003e mapper)`: Transforma cada elemento da Stream usando a função especificada e retorna uma nova Stream contendo os elementos resultantes.\nExemplo: `stream.map(s -\u003e s.toUpperCase())`\n- `sorted()`: Classifica os elementos da Stream em ordem natural (se os elementos forem comparáveis) ou de acordo com um comparador fornecido.\nExemplo: `stream.sorted()`\n- `distinct()`: Remove elementos duplicados da Stream, considerando a implementação do método equals() para comparação.\nExemplo: `stream.distinct()`\n- `limit(long maxSize)`: Limita o número de elementos da Stream aos maxSize primeiros elementos\nExemplo: stream.limit(10)\n- `skip(long n)`: Pula os primeiros n elementos da Stream e retorna uma nova Stream sem eles.\nExemplo: `stream.skip(5)`\n2. Operações Terminais: são aquelas que encerram o pipeline e produzem um resultado final. São elas:\n- `forEach(Consumer\u003cT\u003e action)`: Executa uma ação para cada elemento da Stream.\nExemplo: `stream.forEach(System.out::println)`\n- `toArray()`: Converte a Stream em um array contendo os elementos da Stream.\nExemplo: `stream.toArray()`\n- `collect(Collector\u003cT, A, R\u003e collector)`: Coleta os elementos da Stream em uma estrutura de dados específica, como uma lista ou um mapa.\nExemplo: stream.collect(Collectors.toList())\n- `count()`: Retorna o número de elementos na Stream.\nExemplo: `stream.count()`\n- `anyMatch(Predicate\u003cT\u003e predicate)`: Verifica se algum elemento da Stream atende ao predicado especificado.\nExemplo: `stream.anyMatch(s -\u003e s.startsWith(\"A\"))`\n- `allMatch(Predicate\u003cT\u003e predicate)`: Verifica se todos os elementos da Stream atendem ao predicado especificado.\nExemplo: `stream.allMatch(n -\u003e n \u003e 0)`\n- `noneMatch(Predicate\u003cT\u003e predicate)`: Verifica se nenhum elemento da Stream atende ao predicado especificado.\nExemplo: stream.noneMatch(s -\u003e s.isEmpty())\n- `min(Comparator\u003cT\u003e comparator)` e `max(Comparator\u003cT\u003e comparator)`: Encontra o elemento mínimo e máximo da Stream, respectivamente, de acordo com o comparador fornecido.\nExemplo: `stream.min(Comparator.naturalOrder())` ou `stream.max(Comparator.naturalOrder())`\n- `reduce(T identity, BinaryOperator\u003cT\u003e accumulator)`: Combina os elementos da Stream usando o acumulador especificado e retorna o resultado final.\nExemplo: `stream.reduce(0, (a, b) -\u003e a + b)`\n\n### Lambda\n\n- As expressões lambda permitem representar interfaces funcionais (interfaces com um único método abstrato) de forma mais concisa e possibilitam escrever código no estilo funcional.\n- As interfaces funcionais desempenham um papel crucial na programação funcional em Java, pois servem de base para o uso de expressões lambda.\n- Uma função lambda é uma função sem declaração, isto é, não é necessário colocar um nome, um tipo de retorno e o modificador\nde acesso. A ideia é que o método seja declarado no mesmo lugar em que será usado.\n- As funções lambda em Java tem a sintaxe definida como (argumento) -\u003e (corpo).\n\n```java\npublic class OrdenacaoPessoa {\n  //atributo\n  private List\u003cPessoa\u003e pessoaList;\n\n  //construtor\n  public OrdenacaoPessoa() {\n    this.pessoaList = new ArrayList\u003c\u003e();\n  }\n\n  public List\u003cPessoa\u003e ordenarPorAltura() {\n    if (!pessoaList.isEmpty()) {\n      List\u003cPessoa\u003e pessoasPorAltura = new ArrayList\u003c\u003e(pessoaList);\n      pessoasPorAltura.sort((p1, p2) -\u003e Double.compare(p1.getAltura(), p2.getAltura()));\n      return pessoasPorAltura;\n    } else {\n      throw new RuntimeException(\"A lista está vazia!\");\n    }\n  }\n}\n```\n\n### Method Reference\n\n- Method Reference é um novo recurso do Java 8 que permite fazer referência a um método ou construtor de uma classe (de forma\nfuncional) e assim indicar que ele deve ser utilizado num ponto específico do código, deixando-o mais simples e legível.\n- Para utilizá-lo, basta informar uma classe ou referência seguida do símbolo “::” e o nome do método sem os parênteses no final.\n\n```java\npublic class OrdenacaoPessoa {\n  //atributo\n  private List\u003cPessoa\u003e pessoaList;\n\n  //construtor\n  public OrdenacaoPessoa() {\n    this.pessoaList = new ArrayList\u003c\u003e();\n  }\n\n  public List\u003cPessoa\u003e ordenarPorAltura() {\n    if (!pessoaList.isEmpty()) {\n      List\u003cPessoa\u003e pessoasPorAltura = new ArrayList\u003c\u003e(pessoaList);\n      pessoasPorAltura.sort(Comparator.comparingDouble(Pessoa::getAltura));\n      return pessoasPorAltura;\n    } else {\n      throw new RuntimeException(\"A lista está vazia!\");\n    }\n  }\n}\n```\n\n---\n\n### Referências\n\n[1] \"Java Stream API - Oracle.\" Oracle Brasil. Disponível em: https://www.oracle.com/br/technical-resources/articles/java-stream-api.html.\n\n[2] \"Java Collections API Examples - cami-la.\" GitHub. Disponível em: https://github.com/cami-la/collections-java-api-2023.\n\n[3] \"Como usar funções functional_interface em Java - DevMedia.\" DevMedia. Disponível em: https://www.devmedia.com.br/como-usar-funcoes-lambda-em-java/32826.\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigitalinnovationone%2Fganhando_produtividade_com_stream_api_java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdigitalinnovationone%2Fganhando_produtividade_com_stream_api_java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigitalinnovationone%2Fganhando_produtividade_com_stream_api_java/lists"}