-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index a55e7a1..0000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml
deleted file mode 100644
index 966d5f5..0000000
--- a/.idea/jpa-buddy.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 83beada..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 7ec69ef..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
deleted file mode 100644
index 2b63946..0000000
--- a/.idea/uiDesigner.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1dd..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0d53b8e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly copy otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index ef2591d..2d1b43b 100644
--- a/README.md
+++ b/README.md
@@ -1,47 +1,94 @@
-# Collection Framework API
-
-- Uma coleção (collection) é uma estrutura de dados que serve para agrupar muitos elementos em uma única unidade; estes elementos precisam ser objetos.
-- Uma Collection pode ter coleções homogêneas e heterogêneas, normalmente utilizamos coleções homogêneas de um tipo específico.
-- O núcleo principal das coleções é formado pelas interfaces da figura abaixo; essas interfaces permitem manipular a coleção independentemente do nível de detalhe que elas representam.
-- Temos quatro grandes tipos de coleções: List (lista), Set (conjunto), Queue (fila) e Map (mapa). A partir dessas interfaces, temos muitas subclasses concretas que implementam várias formas diferentes de se trabalhar com cada coleção.
+# 🚀 Collections Java API 2026 (Target: Java 25 LTS)
+Este repositorio representa una auditoría y modernización profunda del framework de Colecciones en Java. Originalmente diseñado bajo estándares antiguos (Java 8), ha sido refactorizado por un **Senior Java Software Architect** para demostrar el estado del arte en desarrollo backend bajo la plataforma **Java 25 (LTS)** y el entorno **IBM Semeru / OpenJ9**.
-- Todas as interfaces e classes são encontradas dentro do pacote (package) java.util.
-- Embora a interface Map não seja filha direta da interface Collection, ela também é considerada uma coleção devido à sua função.
+---
-
-
-- A interface List é uma coleção ordenada que permite a inclusão de elementos duplicados.
-- É um dos tipos de coleção mais utilizados em Java, e as classes de implementação comuns são ArrayList e LinkedList.
-- A List se assemelha a uma matriz com comprimento dinâmico, permitindo adicionar ou remover elementos.
-- A interface List fornece métodos úteis para adicionar elementos em posições específicas, remover ou substituir elementos com base no índice e obter sublistas usando índices.
-- A classe Collections fornece algoritmos úteis para manipulação de List, como ordenação (sort), embaralhamento (shuffle), reversão (reverse) e busca binária (binarySearch).
-
-> ##### *ArrayList*: O ArrayList é uma implementação da interface List que armazena os elementos em uma estrutura de array redimensionável. Isso significa que ele pode crescer automaticamente à medida que novos elementos são adicionados. A principal vantagem do ArrayList é o acesso rápido aos elementos por meio de índices, o que permite recuperar um elemento específico de forma eficiente. No entanto, adicionar ou remover elementos no meio da lista pode ser mais lento, pois requer a realocação de elementos.
-
-> ##### *LinkedList*: O LinkedList é uma implementação da interface List que armazena os elementos em uma lista duplamente vinculada. Cada elemento contém referências para o elemento anterior e próximo na lista. A principal vantagem do LinkedList é a eficiência na adição ou remoção de elementos no início ou no final da lista, pois não é necessário realocar elementos. No entanto, o acesso aos elementos por meio de índices é mais lento, pois requer percorrer a lista até o elemento desejado.
-
-> ##### *Vector*: O Vector é uma implementação antiga da interface List que é semelhante ao ArrayList, mas é sincronizada, ou seja, é thread-safe. Isso significa que várias threads podem manipular um objeto Vector ao mesmo tempo sem causar problemas de concorrência. No entanto, essa sincronização adiciona uma sobrecarga de desempenho, tornando o Vector menos eficiente do que o ArrayList em cenários em que a concorrência não é um problema. Por esse motivo, o uso do Vector é menos comum em aplicações modernas.
-
-### Referências:
-
-[1] "Collections in Java Tutorial." DigitalOcean Community. Disponível em: https://www.digitalocean.com/community/tutorials/collections-in-java-tutorial.
-
-[2] "Java™ Platform, Standard Edition 17 API Specification - Class List." Oracle. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html.
-
-# Fixando os Conhecimentos
-
-Exercícios:
-
-1. Operações Básicas com List
-2. Pesquisa em List
-3. Ordenação nas List
-
-## Operações Básicas com List
-
-### 1. Lista de Tarefas
-
Crie uma classe chamada "ListaTarefas" que possui uma lista de tarefas como atributo. Cada tarefa é representada por uma classe chamada "Tarefa" que possui um atributo de descrição. Implemente os seguintes métodos:
-
-- `adicionarTarefa(String descricao)`: Adiciona uma nova tarefa à lista com a descrição fornecida.
-- `removerTarefa(String descricao)`: Remove uma tarefa da lista com base em sua descrição.
-- `obterNumeroTotalTarefas()`: Retorna o número total de tarefas na lista.
-- `obterDescricoesTarefas()`: Retorna uma lista contendo a descrição de todas as tarefas na lista.
-
-
-### 2. Carrinho de Compras:
-
-
Crie uma classe chamada "CarrinhoDeCompras" que representa um carrinho de compras online. O carrinho deve ser implementado como uma lista de itens. Cada item é representado por uma classe chamada "Item" que possui atributos como nome, preço e quantidade. Implemente os seguintes métodos:
-
-- `adicionarItem(String nome, double preco, int quantidade)`: Adiciona um item ao carrinho com o nome, preço e quantidade especificados.
-- `removerItem(String nome)`: Remove um item do carrinho com base no seu nome.
-- `calcularValorTotal()`: Calcula e retorna o valor total do carrinho, levando em consideração o preço e a quantidade de cada item.
-- `exibirItens()`: Exibe todos os itens presentes no carrinho, mostrando seus nomes, preços e quantidades.
-
-
-----
-
-## Pesquisa em List
-
-### 1. Catálogo de Livros
-
-
Crie uma classe chamada "CatalogoLivros" que possui uma lista de objetos do tipo "Livro" como atributo. Cada livro possui atributos como título, autor e ano de publicação. Implemente os seguintes métodos:
-
-- `adicionarLivro(String titulo, String autor, int anoPublicacao)`: Adiciona um livro ao catálogo.
-- `pesquisarPorAutor(String autor)`: Pesquisa livros por autor e retorna uma lista com os livros encontrados.
-- `pesquisarPorIntervaloAnos(int anoInicial, int anoFinal)`: Pesquisa livros publicados em um determinado intervalo de anos e retorna uma lista com os livros encontrados.
-- `pesquisarPorTitulo(String titulo)`: Pesquisa livros por título e retorna o primeiro livro encontrado.
-
-
-### 2. Soma de Números
-
-
Crie uma classe chamada "SomaNumeros" que possui uma lista de números inteiros como atributo. Implemente os seguintes métodos:
-
-- `adicionarNumero(int numero)`: Adiciona um número à lista de números.
-- `calcularSoma()`: Calcula a soma de todos os números na lista e retorna o resultado.
-- `encontrarMaiorNumero()`: Encontra o maior número na lista e retorna o valor.
-- `encontrarMenorNumero()`: Encontra o menor número na lista e retorna o valor.
-- `exibirNumeros()`: Retorna uma lista contendo todos os números presentes na lista.
-
--------
-
-## Ordenação em List
-
-### 1. Ordenação de Pessoas
-
-
Crie uma classe chamada "OrdenacaoPessoas" que possui uma lista de objetos do tipo "Pessoa" como atributo. Cada pessoa possui atributos como nome, idade e altura. Implemente os seguintes métodos:
-
-- `adicionarPessoa(String nome, int idade, double altura)`: Adiciona uma pessoa à lista.
-- `ordenarPorIdade()`: Ordena as pessoas da lista por idade usando a interface Comparable.
-- `ordenarPorAltura()`: Ordena as pessoas da lista por altura usando um Comparator personalizado.
-
-
-### 2. Ordenação de Números
-
-
Crie uma classe chamada "OrdenacaoNumeros" que possui uma lista de números inteiros como atributo. Implemente os seguintes métodos:
-
-- `adicionarNumero(int numero)`: Adiciona um número à lista.
-- `ordenarAscendente()`: Ordena os números da lista em ordem ascendente usando a interface Comparable e a class Collections.
-- `ordenarDescendente()`: Ordena os números da lista em ordem descendente usando um Comparable e a class Collections.
-
-
----
-### Dúvidas e Suporte
-
-Caso você tenha alguma dúvida, problema ou sugestão, fique à vontade para abrir uma issue no repositório. Espero conseguir te ajudar! (:
diff --git a/out/production/collections-java-api-2023/main/java/map/OperacoesBasicas/AgendaContatos.class b/out/production/collections-java-api-2023/main/java/map/OperacoesBasicas/AgendaContatos.class
deleted file mode 100644
index dbc9552..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/OperacoesBasicas/AgendaContatos.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/OperacoesBasicas/Dicionario.class b/out/production/collections-java-api-2023/main/java/map/OperacoesBasicas/Dicionario.class
deleted file mode 100644
index a53857a..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/OperacoesBasicas/Dicionario.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Ordenacao/AgendaEventos.class b/out/production/collections-java-api-2023/main/java/map/Ordenacao/AgendaEventos.class
deleted file mode 100644
index d072124..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Ordenacao/AgendaEventos.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Ordenacao/ComparatorPorAutor.class b/out/production/collections-java-api-2023/main/java/map/Ordenacao/ComparatorPorAutor.class
deleted file mode 100644
index 1f72f1c..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Ordenacao/ComparatorPorAutor.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Ordenacao/ComparatorPorPreco.class b/out/production/collections-java-api-2023/main/java/map/Ordenacao/ComparatorPorPreco.class
deleted file mode 100644
index e079c4f..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Ordenacao/ComparatorPorPreco.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Ordenacao/Evento.class b/out/production/collections-java-api-2023/main/java/map/Ordenacao/Evento.class
deleted file mode 100644
index 60d7089..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Ordenacao/Evento.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Ordenacao/LivrariaOnline.class b/out/production/collections-java-api-2023/main/java/map/Ordenacao/LivrariaOnline.class
deleted file mode 100644
index d5757d1..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Ordenacao/LivrariaOnline.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Ordenacao/Livro.class b/out/production/collections-java-api-2023/main/java/map/Ordenacao/Livro.class
deleted file mode 100644
index 4d224c1..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Ordenacao/Livro.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Pesquisa/ContagemPalavras.class b/out/production/collections-java-api-2023/main/java/map/Pesquisa/ContagemPalavras.class
deleted file mode 100644
index 4e63335..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Pesquisa/ContagemPalavras.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Pesquisa/EstoqueProdutos.class b/out/production/collections-java-api-2023/main/java/map/Pesquisa/EstoqueProdutos.class
deleted file mode 100644
index 0beacf2..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Pesquisa/EstoqueProdutos.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/Pesquisa/Produto.class b/out/production/collections-java-api-2023/main/java/map/Pesquisa/Produto.class
deleted file mode 100644
index ca39992..0000000
Binary files a/out/production/collections-java-api-2023/main/java/map/Pesquisa/Produto.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/map/README.md b/out/production/collections-java-api-2023/main/java/map/README.md
deleted file mode 100644
index ca81636..0000000
--- a/out/production/collections-java-api-2023/main/java/map/README.md
+++ /dev/null
@@ -1,117 +0,0 @@
-# MAP
-
-
-
-- A interface `Map` é usada para mapear dados na forma de chaves e valores.
-- O `Map` do Java é um objeto que mapeia chaves para valores.
-- Um `Map` não pode conter chaves duplicadas: cada chave pode mapear no máximo um valor.
-- A plataforma Java possui três implementações gerais de `Map`: `HashMap`, `TreeMap` e `LinkedHashMap`.
-- As operações básicas do `Map` são: `put` (inserir ou atualizar), `get` (obter), `containsKey` (verificar se contém uma chave), `containsValue` (verificar se contém um valor), `size` (obter o tamanho) e `isEmpty` (verificar se está vazio).
-
-> ##### *HashTable* é uma implementação antiga da interface Map no Java que é sincronizada e thread-safe, tornando-a adequada para uso em ambientes concorrentes. Ela não permite chaves ou valores nulos e os elementos não são mantidos em uma ordem específica.
-
-> ##### *LinkedHashMap*, por outro lado, é uma implementação da interface Map que preserva a ordem de inserção dos elementos. Cada elemento possui referências ao próximo e ao anterior, formando uma lista encadeada. Isso permite que os elementos sejam iterados na ordem em que foram inseridos. Além disso, o LinkedHashMap também permite chaves ou valores nulos.
-
-> ##### *HashMap* é uma implementação da interface Map que não mantém uma ordem específica dos elementos. Ele armazena os elementos internamente usando uma função de hash para melhorar a eficiência das operações de pesquisa e acesso. O HashMap também permite chaves ou valores nulos.
-
-### Referências:
-
-[1] "Collections in Java Tutorial." DigitalOcean Community. Disponível em: https://www.digitalocean.com/community/tutorials/collections-in-java-tutorial.
-
-[2] "Java™ Platform, Standard Edition 17 API Specification - Class Map." Oracle. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Map.html.
-
-## Fixando os Conhecimentos
-
-Exercícios:
-
-1. Operações Básicas com Map
-2. Pesquisa em Map
-3. Ordenação nas Map
-
-## Operações Básicas com Map
-
-### 1. Agenda de Contatos
-
-
-Crie uma classe chamada "AgendaContatos" que utilize um Map para armazenar os contatos. Cada contato possui um nome como chave e um número de telefone como valor. Implemente os seguintes métodos:
-
-- `adicionarContato(String nome, Integer telefone)`: Adiciona um contato à agenda, associando o nome do contato ao número de telefone correspondente.
-- `removerContato(String nome)`: Remove um contato da agenda, dado o nome do contato.
-- `exibirContatos()`: Exibe todos os contatos da agenda, mostrando o nome e o número de telefone de cada contato.
-- `pesquisarPorNome(String nome)`: Pesquisa um contato pelo nome e retorna o número de telefone correspondente.
-
-
-### 2. Dicionário
-
-
-Crie uma classe chamada "Dicionario" que utilize um Map para armazenar palavras e suas respectivas definições. Implemente os seguintes métodos:
-
-- `adicionarPalavra(String palavra, String definicao)`: Adiciona uma palavra e sua definição ao dicionário, associando a palavra à sua definição correspondente.
-- `removerPalavra(String palavra)`: Remove uma palavra do dicionário, dado o termo a ser removido.
-- `exibirPalavras()`: Exibe todas as palavras e suas definições do dicionário, mostrando cada palavra seguida de sua respectiva definição.
-- `pesquisarPorPalavra(String palavra)`: Pesquisa uma palavra no dicionário e retorna sua definição correspondente.
-
-
----
-
-## Pesquisa em Map
-
-### 1. Estoque de Produtos com Preço
-
-
-Crie uma classe chamada "EstoqueProdutos" que utilize um Map para armazenar os produtos, suas quantidades em estoque e seus respectivos preços. Cada produto possui um código como chave e um objeto Produto como valor, contendo nome, quantidade e preço. Implemente os seguintes métodos:
-
-- `adicionarProduto(long cod, String nome, int quantidade, double preco)`: Adiciona um produto ao estoque, juntamente com a quantidade disponível e o preço.
-- `exibirProdutos()`: Exibe todos os produtos, suas quantidades em estoque e preços.
-- `calcularValorTotalEstoque()`: Calcula e retorna o valor total do estoque, considerando a quantidade e o preço de cada produto.
-- `obterProdutoMaisCaro()`: Retorna o produto mais caro do estoque, ou seja, aquele com o maior preço.
-- `obterProdutoMaisBarato()`: Retorna o produto mais barato do estoque, ou seja, aquele com o menor preço.
-- `obterProdutoMaiorQuantidadeValorTotalNoEstoque()`: Retorna o produto que está em maior quantidade no estoque, considerando o valor total de cada produto (quantidade * preço).
-
-
-### 2. Contagem de Palavras
-
-
-Crie uma classe chamada "ContagemPalavras" que utilize um Map para armazenar as palavras e a quantidade de vezes que cada palavra aparece em um texto. Implemente os seguintes métodos:
-
-- `adicionarPalavra(String palavra, Integer contagem)`: Adiciona uma palavra à contagem.
-- `removerPalavra(String palavra)`: Remove uma palavra da contagem, se estiver presente.
-- `exibirContagemPalavras()`: Exibe todas as palavras e suas respectivas contagens.
-- `encontrarPalavraMaisFrequente()`: Encontra a palavra mais frequente no texto e retorna a palavra e sua contagem.
-
-
----
-
-## Ordenação nos Map
-
-### 1. Agenda de Eventos
-
-
-Crie uma classe chamada "AgendaEventos" que utilize um `Map` para armazenar as datas e seus respectivos Eventos. Cada evento é representado por um objeto da classe "Evento", que possui atributos como nome do evento e o nome da atração. Implemente os seguintes métodos:
-
-- `adicionarEvento(LocalDate data, String nome, String atracao)`: Adiciona um evento à agenda.
-- `exibirAgenda()`: Exibe a agenda de eventos em ordem crescente de data.
-- `obterProximoEvento()`: Retorna o próximo evento que ocorrerá.
-
-
-### 2. Livraria Online
-
-
-Crie uma classe chamada "LivrariaOnline" que representa uma livraria online. Essa classe utiliza um Map para armazenar os livros disponíveis na livraria, utilizando o link da obra na Amazon Marketplace como chave e um objeto da classe "Livro" como valor. A classe "Livro" possui atributos como título, autor e preço. Através da classe "LivrariaOnline", implemente os seguintes métodos:
-
-- `adicionarLivro(String link, String titulo, String autor, private double preco)`: Adiciona um livro à livraria, utilizando o ISBN como chave no Map.
-- `removerLivro(String titulo)`: Remove um livro da livraria, dado o titulo do livro.
-- `exibirLivrosOrdenadosPorPreco()`: Exibe os livros da livraria em ordem crescente de preço.
-- `pesquisarLivrosPorAutor(String autor)`: Retorna uma lista de todos os livros escritos por um determinado autor.
-- `obterLivroMaisCaro()`: Retorna o livro mais caro disponível na livraria.
-- `exibirLivroMaisBarato()`: Retorna o livro mais barato disponível na livraria.
-
-
----
-
-### Dúvidas e Suporte
-
-Caso você tenha alguma dúvida, problema ou sugestão, fique à vontade para abrir uma issue no repositório. Espero conseguir te ajudar! (:
\ No newline at end of file
diff --git a/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/ConjuntoConvidados.class b/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/ConjuntoConvidados.class
deleted file mode 100644
index f7a075c..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/ConjuntoConvidados.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/ConjuntoPalavrasUnicas.class b/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/ConjuntoPalavrasUnicas.class
deleted file mode 100644
index ebc96b8..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/ConjuntoPalavrasUnicas.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/Convidado.class b/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/Convidado.class
deleted file mode 100644
index 9969919..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/OperacoesBasicas/Convidado.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Ordenacao/Aluno.class b/out/production/collections-java-api-2023/main/java/set/Ordenacao/Aluno.class
deleted file mode 100644
index 1cf9989..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Ordenacao/Aluno.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Ordenacao/CadastroProdutos.class b/out/production/collections-java-api-2023/main/java/set/Ordenacao/CadastroProdutos.class
deleted file mode 100644
index 83316ab..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Ordenacao/CadastroProdutos.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Ordenacao/ComparatorNota.class b/out/production/collections-java-api-2023/main/java/set/Ordenacao/ComparatorNota.class
deleted file mode 100644
index da64293..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Ordenacao/ComparatorNota.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Ordenacao/ComparatorPorPreco.class b/out/production/collections-java-api-2023/main/java/set/Ordenacao/ComparatorPorPreco.class
deleted file mode 100644
index 725341f..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Ordenacao/ComparatorPorPreco.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Ordenacao/GerenciadorAlunos.class b/out/production/collections-java-api-2023/main/java/set/Ordenacao/GerenciadorAlunos.class
deleted file mode 100644
index d9fd69b..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Ordenacao/GerenciadorAlunos.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Ordenacao/Produto.class b/out/production/collections-java-api-2023/main/java/set/Ordenacao/Produto.class
deleted file mode 100644
index 642c87b..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Ordenacao/Produto.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Pesquisa/AgendaContatos.class b/out/production/collections-java-api-2023/main/java/set/Pesquisa/AgendaContatos.class
deleted file mode 100644
index 6564a0a..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Pesquisa/AgendaContatos.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Pesquisa/Contato.class b/out/production/collections-java-api-2023/main/java/set/Pesquisa/Contato.class
deleted file mode 100644
index de97fbe..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Pesquisa/Contato.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Pesquisa/ListaTarefas.class b/out/production/collections-java-api-2023/main/java/set/Pesquisa/ListaTarefas.class
deleted file mode 100644
index b38fbba..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Pesquisa/ListaTarefas.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/Pesquisa/Tarefa.class b/out/production/collections-java-api-2023/main/java/set/Pesquisa/Tarefa.class
deleted file mode 100644
index f9a203f..0000000
Binary files a/out/production/collections-java-api-2023/main/java/set/Pesquisa/Tarefa.class and /dev/null differ
diff --git a/out/production/collections-java-api-2023/main/java/set/README.md b/out/production/collections-java-api-2023/main/java/set/README.md
deleted file mode 100644
index a587fba..0000000
--- a/out/production/collections-java-api-2023/main/java/set/README.md
+++ /dev/null
@@ -1,117 +0,0 @@
-# SET
-
-
-
-- A interface `Set` é uma coleção que não pode conter elementos duplicados.
-- Essa interface representa o conceito matemático de um conjunto e é usada para representar conjuntos, como um baralho de cartas.
-- A plataforma Java possui três implementações de `Set` de uso geral: `HashSet`, `TreeSet` e `LinkedHashSet`.
-- A interface `Set` não permite acesso aleatório a um elemento na coleção.
-- Para percorrer os elementos de um `Set`, você pode usar um iterador ou um loop foreach.
-
-> ##### *HashSet*: O HashSet é uma implementação da interface Set que armazena os elementos em uma tabela hash. Ele não mantém uma ordem específica dos elementos. A principal vantagem do HashSet é que ele oferece um desempenho de busca muito eficiente, pois usa funções hash para indexar os elementos. No entanto, a ordem em que os elementos são adicionados pode não ser preservada ao percorrer o conjunto.
-
-> ##### *TreeSet*: O TreeSet é uma implementação da interface Set que armazena os elementos em uma árvore binária balanceada. Isso significa que os elementos são armazenados em uma ordem classificada e são mantidos automaticamente em ordem crescente. A principal vantagem do TreeSet é que os elementos são sempre retornados na ordem classificada, o que facilita a obtenção de elementos em uma determinada ordem. No entanto, a busca e a inserção são um pouco mais lentas em comparação com o HashSet.
-
-> ##### *LinkedHashSet*: O LinkedHashSet é uma implementação da interface Set que mantém a ordem de inserção dos elementos, além de usar uma tabela hash para obter um bom desempenho de busca. Ele é semelhante ao HashSet, mas também mantém uma lista duplamente vinculada que preserva a ordem de inserção. Isso permite que os elementos sejam percorridos na ordem em que foram adicionados. O LinkedHashSet é útil quando você precisa manter a ordem de inserção dos elementos e também ter um bom desempenho de busca.
-
-### Referências:
-
-[1] "Collections in Java Tutorial." DigitalOcean Community. Disponível em: https://www.digitalocean.com/community/tutorials/collections-in-java-tutorial.
-
-[2] "Java™ Platform, Standard Edition 17 API Specification - Class Set." Oracle. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Set.html.
-
-## Fixando os Conhecimentos
-
-Exercícios:
-
-1. Operações Básicas com Set
-2. Pesquisa em Set
-3. Ordenação nas Set
-
-## Operações Básicas com Set
-
-### 1. Conjunto de Convidados
-
-
Crie uma classe chamada "ConjuntoConvidados" que possui um conjunto de objetos do tipo "Convidado" como atributo. Cada convidado possui atributos como nome e código do convite. Implemente os seguintes métodos:
-
-- `adicionarConvidado(String nome, int codigoConvite)`: Adiciona um convidado ao conjunto.
-- `removerConvidadoPorCodigoConvite(int codigoConvite)`: Remove um convidado do conjunto com base no código do convite.
-- `contarConvidados()`: Conta o número total de convidados no Set.
-- `exibirConvidados()`: Exibe todos os convidados do conjunto.
-
-
-### 2. Conjunto de Palavras Únicas
-
-
-Crie uma classe chamada "ConjuntoPalavrasUnicas" que possui um conjunto de palavras únicas como atributo. Implemente os seguintes métodos:
-
-- `adicionarPalavra(String palavra)`: Adiciona uma palavra ao conjunto.
-- `removerPalavra(String palavra)`: Remove uma palavra do conjunto.
-- `verificarPalavra(String palavra)`: Verifica se uma palavra está presente no conjunto.
-- `exibirPalavrasUnicas()`: Exibe todas as palavras únicas do conjunto.
-
-
-----
-
-## Pesquisa em Set
-
-### 1. Agenda de Contatos
-
-
-Crie uma classe chamada "AgendaContatos" que possui um conjunto de objetos do tipo "Contato" como atributo. Cada contato possui atributos como nome e número de telefone. Implemente os seguintes métodos:
-
-- `adicionarContato(String nome, int numero)`: Adiciona um contato à agenda.
-- `exibirContatos()`: Exibe todos os contatos da agenda.
-- `pesquisarPorNome(String nome)`: Pesquisa contatos pelo nome e retorna uma conjunto com os contatos encontrados.
-- `atualizarNumeroContato(String nome, int novoNumero)`: Atualiza o número de telefone de um contato específico.
-
-
-### 2. Lista de Tarefas
-
-
-Crie uma classe chamada "ListaTarefas" que possui um conjunto de objetos do tipo "Tarefa" como atributo. Cada tarefa possui um atributo de descrição e um atributo booleano para indicar se a tarefa foi concluída ou não. Implemente os seguintes métodos:
-
-- `adicionarTarefa(String descricao)`: Adiciona uma nova tarefa ao Set.
-- `removerTarefa(String descricao)`: Remove uma tarefa do Set de acordo com a descrição, se estiver presente.
-- `exibirTarefas()`: Exibe todas as tarefas da lista de tarefas.
-- `contarTarefas()`: Conta o número total de tarefas na lista de tarefas.
-- `obterTarefasConcluidas()`: Retorna um Set com as tarefas concluídas.
-- `obterTarefasPendentes()`: Retorna um Set com as tarefas pendentes.
-- `marcarTarefaConcluida(String descricao)`: Marca uma tarefa como concluída de acordo com a descrição.
-- `marcarTarefaPendente(String descricao)`: Marca uma tarefa como pendente de acordo com a descrição.
-- `limparListaTarefas()`: Remove todas as tarefas da lista de tarefas.
-
-
----
-
-## Ordenação em Set
-
-### 1. Cadastro de Produtos
-
-
-Crie uma classe chamada "CadastroProdutos" que possui um conjunto de objetos do tipo "Produto" como atributo. Cada produto possui atributos como nome, cod, preço e quantidade. Implemente os seguintes métodos:
-
-- `adicionarProduto(long cod, String nome, double preco, int quantidade)`: Adiciona um produto ao cadastro.
-- `exibirProdutosPorNome()`: Exibe todos os produtos do cadastro em ordem alfabética pelo nome.
-- `exibirProdutosPorPreco()`: Exibe todos os produtos do cadastro em ordem crescente de preço.
-
-
-### 2. Lista de Alunos
-
-
-Crie uma classe chamada "GerenciadorAlunos" que irá lidar com uma lista de alunos. Cada aluno terá atributos como nome, matrícula e nota. Implementaremos os seguintes métodos:
-
-- `adicionarAluno(String nome, Long matricula, double media)`: Adiciona um aluno ao conjunto.
-- `removerAluno(long matricula)`: Remove um aluno ao conjunto a partir da matricula, se estiver presente.
-- `exibirAlunosPorNome()`: Exibe todos os alunos do conjunto em ordem alfabética pelo nome.
-- `exibirAlunosPorNota()`: Exibe todos os alunos do conjunto em ordem crescente de nota.
-- `exibirAlunos()`: Exibe todos os alunos do conjunto.
-
-
----
-### Dúvidas e Suporte
-
-Caso você tenha alguma dúvida, problema ou sugestão, fique à vontade para abrir uma issue no repositório. Espero conseguir te ajudar! (:
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..0735f20
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1 @@
+rootProject.name = "collections-java-api-2026"
diff --git a/src/main/java/list/Ordenacao/OrdenacaoPessoas.java b/src/main/java/list/Ordenacao/OrdenacaoPessoas.java
index 05a325e..4709bd9 100644
--- a/src/main/java/list/Ordenacao/OrdenacaoPessoas.java
+++ b/src/main/java/list/Ordenacao/OrdenacaoPessoas.java
@@ -29,7 +29,7 @@ public List ordenarPorIdade() {
public List ordenarPorAltura() {
List pessoasPorAltura = new ArrayList<>(pessoaList);
if (!pessoaList.isEmpty()) {
- Collections.sort(pessoasPorAltura, new ComparatorPorAltura());
+ pessoasPorAltura.sort(Pessoa.porAltura());
return pessoasPorAltura;
} else {
throw new RuntimeException("A lista está vazia!");
@@ -40,13 +40,13 @@ public static void main(String[] args) {
// Criando uma instância da classe OrdenacaoPessoas
OrdenacaoPessoas ordenacaoPessoas = new OrdenacaoPessoas();
- // Adicionando pessoas à lista
+ // Adicionando personas à lista
ordenacaoPessoas.adicionarPessoa("Alice", 20, 1.56);
ordenacaoPessoas.adicionarPessoa("Bob", 30, 1.80);
ordenacaoPessoas.adicionarPessoa("Charlie", 25, 1.70);
ordenacaoPessoas.adicionarPessoa("David", 17, 1.56);
- // Exibindo a lista de pessoas adicionadas
+ // Exibindo a lista de personas adicionadas
System.out.println(ordenacaoPessoas.pessoaList);
// Ordenando e exibindo por idade
diff --git a/src/main/java/list/Ordenacao/Pessoa.java b/src/main/java/list/Ordenacao/Pessoa.java
index ef71a57..a0988fb 100644
--- a/src/main/java/list/Ordenacao/Pessoa.java
+++ b/src/main/java/list/Ordenacao/Pessoa.java
@@ -4,9 +4,9 @@
public class Pessoa implements Comparable {
//atributos
- private String nome;
- private int idade;
- private double altura;
+ private final String nome;
+ private final int idade;
+ private final double altura;
public Pessoa(String nome, int idade, double altura) {
this.nome = nome;
@@ -16,18 +16,18 @@ public Pessoa(String nome, int idade, double altura) {
@Override
public int compareTo(Pessoa p) {
- return Integer.compare(idade, p.getIdade());
+ return Integer.compare(this.idade, p.idade());
}
- public String getNome() {
+ public String nome() {
return nome;
}
- public int getIdade() {
+ public int idade() {
return idade;
}
- public double getAltura() {
+ public double altura() {
return altura;
}
@@ -39,11 +39,9 @@ public String toString() {
", altura=" + altura +
'}';
}
-}
-class ComparatorPorAltura implements Comparator {
- @Override
- public int compare(Pessoa p1, Pessoa p2) {
- return Double.compare(p1.getAltura(), p2.getAltura());
+ // Java 25 Fluent Comparator syntax
+ public static Comparator porAltura() {
+ return Comparator.comparingDouble(Pessoa::altura);
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/me/dio/collections/core/ConteudoEducacional.java b/src/main/java/me/dio/collections/core/ConteudoEducacional.java
new file mode 100644
index 0000000..0b16793
--- /dev/null
+++ b/src/main/java/me/dio/collections/core/ConteudoEducacional.java
@@ -0,0 +1,31 @@
+package me.dio.collections.core;
+
+/**
+ * Patrón: Sealed Classes (Java 17+)
+ * Define una jerarquía cerrada y segura de contenidos educativos.
+ * Solo las subclases permitidas pueden heredar de esta base, garantizando exhaustividad.
+ */
+public sealed interface ConteudoEducacional permits Aula, Laboratorio, Desafio {
+ String titulo();
+ int cargaHoraria();
+
+ // Método default para procesamiento común amigable con OpenJ9
+ default String formatarRelatorio() {
+ return String.format("[%s] %s (%dh)", this.getClass().getSimpleName(), titulo(), cargaHoraria());
+ }
+}
+
+/**
+ * Record Aula: Representa una lección teórica.
+ */
+record Aula(String titulo, int cargaHoraria, String videoUrl) implements ConteudoEducacional {}
+
+/**
+ * Record Laboratorio: Representa una práctica guiada.
+ */
+record Laboratorio(String titulo, int cargaHoraria, String stackTecnologica) implements ConteudoEducacional {}
+
+/**
+ * Record Desafio: Representa una evaluación de código.
+ */
+record Desafio(String titulo, int cargaHoraria, double dificuldade) implements ConteudoEducacional {}
diff --git a/src/main/java/me/dio/collections/core/ProcessadorEducacional.java b/src/main/java/me/dio/collections/core/ProcessadorEducacional.java
new file mode 100644
index 0000000..69b37f5
--- /dev/null
+++ b/src/main/java/me/dio/collections/core/ProcessadorEducacional.java
@@ -0,0 +1,59 @@
+package me.dio.collections.core;
+
+import java.util.List;
+import java.util.SequencedCollection;
+import java.util.ArrayList;
+
+/**
+ * Senior Architect Pattern: Pattern Matching for switch (Java 21+)
+ * Implementa el procesamiento exhaustivo de contenidos sin casting manual.
+ */
+public class ProcessadorEducacional {
+
+ private final List trilha;
+
+ public ProcessadorEducacional() {
+ this.trilha = new ArrayList<>();
+ }
+
+ public void adicionarConteudo(ConteudoEducacional conteudo) {
+ trilha.add(conteudo);
+ }
+
+ /**
+ * Procesa la trilha educativa usando Pattern Matching.
+ * Elimina el 'boilerplate' de instanceof y casting.
+ */
+ public void processarTrilha() {
+ trilha.forEach(conteudo -> {
+ String resultado = switch (conteudo) {
+ case Aula a -> "📺 Assistindo aula: " + a.titulo() + " em " + a.videoUrl();
+ case Laboratorio l -> "🛠️ Praticando lab: " + l.titulo() + " usando " + l.stackTecnologica();
+ case Desafio d -> "🔥 Desafio: " + d.titulo() + " [Dificuldade: " + d.dificuldade() + "]";
+ // No se necesita default: el compilador garantiza que manejamos todos los tipos permitidos (Exhaustividad)
+ };
+ System.out.println(resultado);
+ });
+ }
+
+ /**
+ * Calcula la carga horaria total usando recursión o streams.
+ */
+ public int calcularCargaHorariaTotal() {
+ return trilha.stream()
+ .mapToInt(ConteudoEducacional::cargaHoraria)
+ .sum();
+ }
+
+ public static void main(String[] args) {
+ ProcessadorEducacional processador = new ProcessadorEducacional();
+
+ processador.adicionarConteudo(new Aula("Java Collections", 2, "https://dio.me/java-25"));
+ processador.adicionarConteudo(new Laboratorio("Refatorando para Records", 4, "OpenJ9 / IntelliJ"));
+ processador.adicionarConteudo(new Desafio("Stress Test de Set", 1, 5.0));
+
+ System.out.println("--- Iniciando Trilha Educacional Target 2026 ---");
+ processador.processarTrilha();
+ System.out.println("Carga Horária Total: " + processador.calcularCargaHorariaTotal() + " horas.");
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/operacoes/Item.java b/src/main/java/me/dio/collections/list/operacoes/Item.java
new file mode 100644
index 0000000..20d8937
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/operacoes/Item.java
@@ -0,0 +1,16 @@
+package me.dio.collections.list.operacoes;
+
+/**
+ * Representa um item em um carrinho de compras.
+ * Utiliza Record (Java 14+) para imutabilidade nativa e redução de boilerplate.
+ */
+public record Item(String nome, double preco, int quantidade) {
+ @Override
+ public String toString() {
+ return "Item{" +
+ "nome='" + nome + '\'' +
+ ", preco=" + preco +
+ ", quantidade=" + quantidade +
+ '}';
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/operacoes/ListaTarefa.java b/src/main/java/me/dio/collections/list/operacoes/ListaTarefa.java
new file mode 100644
index 0000000..118a9bc
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/operacoes/ListaTarefa.java
@@ -0,0 +1,58 @@
+package me.dio.collections.list.operacoes;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Operações básicas em Listas usando Java 25.
+ * Substitui loops imperativos por Streams API.
+ */
+public class ListaTarefa {
+ private final List tarefaList;
+
+ public ListaTarefa() {
+ this.tarefaList = new ArrayList<>();
+ }
+
+ public void adicionarTarefa(String descricao) {
+ tarefaList.add(new Tarefa(descricao));
+ }
+
+ /**
+ * Remove tarefas com base na descrição utilizando removeIf (Java 8+).
+ * Garante que todas as tarefas correspondentes sejam removidas em uma única operação.
+ */
+ public void removerTarefa(String descricao) {
+ if (tarefaList.isEmpty()) throw new IllegalStateException("A lista está vazia!");
+
+ tarefaList.removeIf(t -> t.descricao().equalsIgnoreCase(descricao));
+ }
+
+ public int obterNumeroTotalTarefas() {
+ return tarefaList.size();
+ }
+
+ /**
+ * Retorna uma lista inmutável de descrições das tarefas.
+ */
+ public List obterDescricoesTarefas() {
+ return tarefaList.stream()
+ .map(Tarefa::descricao)
+ .collect(Collectors.toUnmodifiableList());
+ }
+
+ public static void main(String[] args) {
+ ListaTarefa listaTarefa = new ListaTarefa();
+
+ listaTarefa.adicionarTarefa("Comprar leite");
+ listaTarefa.adicionarTarefa("Estudar para o exame");
+ listaTarefa.adicionarTarefa("Fazer exercícios");
+
+ System.out.println("Tarefas: " + listaTarefa.obterDescricoesTarefas());
+ System.out.println("Total: " + listaTarefa.obterNumeroTotalTarefas());
+
+ listaTarefa.removerTarefa("Comprar leite");
+ System.out.println("Tarefas após remoção: " + listaTarefa.obterDescricoesTarefas());
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/operacoes/Tarefa.java b/src/main/java/me/dio/collections/list/operacoes/Tarefa.java
new file mode 100644
index 0000000..f8d94e7
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/operacoes/Tarefa.java
@@ -0,0 +1,12 @@
+package me.dio.collections.list.operacoes;
+
+/**
+ * Representa uma tarefa no sistema.
+ * Utiliza Record (Java 14+) para imutabilidade nativa e redução de boilerplate.
+ */
+public record Tarefa(String descricao) {
+ @Override
+ public String toString() {
+ return descricao;
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/ordenacao/OrdenacaoPessoas.java b/src/main/java/me/dio/collections/list/ordenacao/OrdenacaoPessoas.java
new file mode 100644
index 0000000..3de5552
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/ordenacao/OrdenacaoPessoas.java
@@ -0,0 +1,71 @@
+package me.dio.collections.list.ordenacao;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.SequencedCollection;
+import java.util.stream.Collectors;
+
+/**
+ * Classe para ordenação de pessoas.
+ * Implementa Sequenced Collections (Java 21+) y Streams para lógica moderna.
+ */
+public class OrdenacaoPessoas {
+ private final List pessoaList;
+
+ public OrdenacaoPessoas() {
+ this.pessoaList = new ArrayList<>();
+ }
+
+ public void adicionarPessoa(String nome, int idade, double altura) {
+ pessoaList.add(new Pessoa(nome, idade, altura));
+ }
+
+ /**
+ * Ordena la lista por edad usando Streams.
+ */
+ public List ordenarPorIdade() {
+ if (pessoaList.isEmpty()) throw new IllegalStateException("A lista está vazia!");
+
+ return pessoaList.stream()
+ .sorted()
+ .collect(Collectors.collectingAndThen(
+ Collectors.toList(),
+ Collections::unmodifiableList
+ ));
+ }
+
+ /**
+ * Ordena la lista por altura usando Comparator fluido.
+ */
+ public List ordenarPorAltura() {
+ if (pessoaList.isEmpty()) throw new IllegalStateException("A lista está vazia!");
+
+ return pessoaList.stream()
+ .sorted(Pessoa.porAltura())
+ .collect(Collectors.collectingAndThen(
+ Collectors.toList(),
+ Collections::unmodifiableList
+ ));
+ }
+
+ /**
+ * Exemplo de uso de Sequenced Collection para inverter a ordem.
+ */
+ public List obtenerListaInvertida() {
+ return (List) ((SequencedCollection) pessoaList).reversed().stream()
+ .collect(Collectors.toUnmodifiableList());
+ }
+
+ public static void main(String[] args) {
+ OrdenacaoPessoas ordenacaoPessoas = new OrdenacaoPessoas();
+
+ ordenacaoPessoas.adicionarPessoa("Alice", 20, 1.56);
+ ordenacaoPessoas.adicionarPessoa("Bob", 30, 1.80);
+ ordenacaoPessoas.adicionarPessoa("Charlie", 25, 1.70);
+ ordenacaoPessoas.adicionarPessoa("David", 17, 1.56);
+
+ System.out.println("Por Idade: " + ordenacaoPessoas.ordenarPorIdade());
+ System.out.println("Por Altura: " + ordenacaoPessoas.ordenarPorAltura());
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/ordenacao/Pessoa.java b/src/main/java/me/dio/collections/list/ordenacao/Pessoa.java
new file mode 100644
index 0000000..a1dba95
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/ordenacao/Pessoa.java
@@ -0,0 +1,26 @@
+package me.dio.collections.list.ordenacao;
+
+import java.util.Comparator;
+
+/**
+ * Record Pessoa: Inmutabilidad nativa y reducción de boilerplate.
+ */
+public record Pessoa(String nome, int idade, double altura) implements Comparable {
+
+ @Override
+ public int compareTo(Pessoa p) {
+ return Integer.compare(this.idade, p.idade());
+ }
+
+ /**
+ * Factory method para un Comparator fluído por altura.
+ */
+ public static Comparator porAltura() {
+ return Comparator.comparingDouble(Pessoa::altura);
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Pessoa[nome=%s, idade=%d, altura=%.2f]", nome, idade, altura);
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/pesquisa/CatalogoLivros.java b/src/main/java/me/dio/collections/list/pesquisa/CatalogoLivros.java
new file mode 100644
index 0000000..f9db351
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/pesquisa/CatalogoLivros.java
@@ -0,0 +1,61 @@
+package me.dio.collections.list.pesquisa;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Catálogo de livros moderno usando Java 25.
+ */
+public class CatalogoLivros {
+ private final List livroList;
+
+ public CatalogoLivros() {
+ this.livroList = new ArrayList<>();
+ }
+
+ public void adicionarLivro(String titulo, String autor, int anoPublicacao) {
+ livroList.add(new Livro(titulo, autor, anoPublicacao));
+ }
+
+ /**
+ * Pesquisa livros por autor usando Streams y filtragem declarativa.
+ */
+ public List pesquisarPorAutor(String autor) {
+ if (this.livroList.isEmpty()) throw new IllegalStateException("O catálogo está vazio!");
+
+ return this.livroList.stream()
+ .filter(l -> l.autor().equalsIgnoreCase(autor))
+ .collect(Collectors.toUnmodifiableList());
+ }
+
+ /**
+ * Pesquisa livros por intervalo de anos com streams.
+ */
+ public List pesquisarPorIntervaloAnos(int anoInicial, int anoFinal) {
+ if (this.livroList.isEmpty()) throw new IllegalStateException("O catálogo está vazio!");
+
+ return this.livroList.stream()
+ .filter(l -> l.anoPublicacao() >= anoInicial && l.anoPublicacao() <= anoFinal)
+ .collect(Collectors.toUnmodifiableList());
+ }
+
+ /**
+ * Pesquisa livro por título y retorna o primeiro encontrado usando Optional.
+ */
+ public Optional pesquisarPorTitulo(String titulo) {
+ return this.livroList.stream()
+ .filter(l -> l.titulo().equalsIgnoreCase(titulo))
+ .findFirst();
+ }
+
+ public static void main(String[] args) {
+ CatalogoLivros catalogoLivros = new CatalogoLivros();
+ catalogoLivros.adicionarLivro("Microsserviços Prontos Para a Produção", "Susan J. Fowler", 2017);
+ catalogoLivros.adicionarLivro("Java Guia do Programador", "Peter Jandl Junior", 2021);
+ catalogoLivros.adicionarLivro("Código Limpo", "Robert C. Martin", 2009);
+
+ System.out.println("Livros de Robert C. Martin: " + catalogoLivros.pesquisarPorAutor("Robert C. Martin"));
+ }
+}
diff --git a/src/main/java/me/dio/collections/list/pesquisa/Livro.java b/src/main/java/me/dio/collections/list/pesquisa/Livro.java
new file mode 100644
index 0000000..c0f6aef
--- /dev/null
+++ b/src/main/java/me/dio/collections/list/pesquisa/Livro.java
@@ -0,0 +1,11 @@
+package me.dio.collections.list.pesquisa;
+
+/**
+ * Record Livro: Inmutabilidad nativa.
+ */
+public record Livro(String titulo, String autor, int anoPublicacao) {
+ @Override
+ public String toString() {
+ return String.format("Livro[titulo=%s, autor=%s, ano=%d]", titulo, autor, anoPublicacao);
+ }
+}
diff --git a/src/main/java/me/dio/collections/map/operacoes/AgendaContatos.java b/src/main/java/me/dio/collections/map/operacoes/AgendaContatos.java
new file mode 100644
index 0000000..c71dbb4
--- /dev/null
+++ b/src/main/java/me/dio/collections/map/operacoes/AgendaContatos.java
@@ -0,0 +1,54 @@
+package me.dio.collections.map.operacoes;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Modernización de la Agenda de Contatos usando Java 25.
+ * Refactor de Sincronización Javadoc vs Código: Uso de 'put' o 'merge' como método atómico.
+ */
+public class AgendaContatos {
+ private final Map agendaContatoMap;
+
+ public AgendaContatos() {
+ this.agendaContatoMap = new HashMap<>();
+ }
+
+ /**
+ * Sincronización con Javadoc: Actualiza el contacto o lo añade de forma elegante.
+ * En Java 25, 'put' ya es una operación eficiente sobre Map.
+ */
+ public void adicionarContato(String nome, Integer telefone) {
+ // Opción 1: Put directo (sobrescribe si existe)
+ agendaContatoMap.put(nome, telefone);
+
+ // Opción 2 (Merge): Por si se desea lógica de desempate en el futuro
+ // agendaContatoMap.merge(nome, telefone, (oldValue, newValue) -> newValue);
+ }
+
+ public void removerContato(String nome) {
+ if (agendaContatoMap.isEmpty()) throw new IllegalStateException("A agenda está vazia.");
+ agendaContatoMap.remove(nome);
+ }
+
+ public void exibirContatos() {
+ if (agendaContatoMap.isEmpty()) {
+ System.out.println("A agenda está vazia.");
+ return;
+ }
+ agendaContatoMap.forEach((nome, telefone) ->
+ System.out.printf("Nome: %s | Telefone: %d%n", nome, telefone));
+ }
+
+ public Optional pesquisarPorNome(String nome) {
+ return Optional.ofNullable(agendaContatoMap.get(nome));
+ }
+
+ public static void main(String[] args) {
+ AgendaContatos agendaContatos = new AgendaContatos();
+ agendaContatos.adicionarContato("Camila", 123456);
+ agendaContatos.adicionarContato("João", 5665);
+ agendaContatos.exibirContatos();
+ }
+}
diff --git a/src/main/java/me/dio/collections/set/operacoes/Convidado.java b/src/main/java/me/dio/collections/set/operacoes/Convidado.java
new file mode 100644
index 0000000..7e7ddd1
--- /dev/null
+++ b/src/main/java/me/dio/collections/set/operacoes/Convidado.java
@@ -0,0 +1,33 @@
+package me.dio.collections.set.operacoes;
+
+import java.util.Objects;
+
+/**
+ * Representa um convidado.
+ *
+ * ATENÇÃO: Embora seja um Record, sobrescrevemos equals() e hashCode()
+ * para garantir que a identidade do Set seja baseada APENAS no código do convite,
+ * conforme as regras de negócio de conjuntos de convidados.
+ */
+public record Convidado(String nome, int codigoConvite) {
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Convidado convidado)) return false;
+ return codigoConvite == convidado.codigoConvite;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(codigoConvite);
+ }
+
+ @Override
+ public String toString() {
+ return "Convidado{" +
+ "nome='" + nome + '\'' +
+ ", codigoConvite=" + codigoConvite +
+ '}';
+ }
+}
diff --git a/src/main/java/me/dio/collections/set/ordenacao/CadastroProdutos.java b/src/main/java/me/dio/collections/set/ordenacao/CadastroProdutos.java
new file mode 100644
index 0000000..3d6c262
--- /dev/null
+++ b/src/main/java/me/dio/collections/set/ordenacao/CadastroProdutos.java
@@ -0,0 +1,56 @@
+package me.dio.collections.set.ordenacao;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+/**
+ * Modernização do Cadastro de Produtos com Java 25.
+ * Refactor de Consistencia: Preservación de orden determinista en Sets.
+ */
+public class CadastroProdutos {
+ private final Set productoSet;
+
+ public CadastroProdutos() {
+ this.productoSet = new HashSet<>();
+ }
+
+ public void adicionarProduto(long codigo, String nome, double preco, int cantidad) {
+ productoSet.add(new Produto(codigo, nome, preco, cantidad));
+ }
+
+ /**
+ * Ordenación Natural por Nombre (TreeSet usa el compareTo robusto).
+ */
+ public Set exibirProdutosPorNome() {
+ return new TreeSet<>(productoSet);
+ }
+
+ /**
+ * Ordenación por Preço: Preservación de orden determinista.
+ * Cambiamos a toCollection(LinkedHashSet::new) para que el orden del Stream se mantenga.
+ */
+ public Set exibirProdutosPorPreco() {
+ return productoSet.stream()
+ .sorted(Produto.porPreco())
+ .collect(Collectors.collectingAndThen(
+ Collectors.toCollection(LinkedHashSet::new),
+ Collections::unmodifiableSet
+ ));
+ }
+
+ public static void main(String[] args) {
+ CadastroProdutos cadastroProdutos = new CadastroProdutos();
+
+ cadastroProdutos.adicionarProduto(1L, "Smartphone", 1000d, 10);
+ cadastroProdutos.adicionarProduto(2L, "Notebook", 1500d, 5);
+ cadastroProdutos.adicionarProduto(3L, "Mouse", 30d, 20);
+ cadastroProdutos.adicionarProduto(4L, "Teclado", 50d, 15);
+
+ System.out.println("Por Nome (Natural): " + cadastroProdutos.exibirProdutosPorNome());
+ System.out.println("Por Preço (Custom & Ordered): " + cadastroProdutos.exibirProdutosPorPreco());
+ }
+}
diff --git a/src/main/java/me/dio/collections/set/ordenacao/GerenciadorAlunos.java b/src/main/java/me/dio/collections/set/ordenacao/GerenciadorAlunos.java
new file mode 100644
index 0000000..87ea662
--- /dev/null
+++ b/src/main/java/me/dio/collections/set/ordenacao/GerenciadorAlunos.java
@@ -0,0 +1,91 @@
+package me.dio.collections.set.ordenacao;
+
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.SequencedSet;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+/**
+ * Modernización del Gerenciador de Alunos usando Java 21+ SequencedSet.
+ * Record Aluno garantiza inmutabilidad.
+ */
+public class GerenciadorAlunos {
+ private final Set alunoSet;
+
+ public GerenciadorAlunos() {
+ this.alunoSet = new HashSet<>();
+ }
+
+ public void adicionarAluno(String nome, long matricula, double media) {
+ alunoSet.add(new Aluno(nome, matricula, media));
+ }
+
+ public void removerAluno(long matricula) {
+ alunoSet.removeIf(a -> a.matricula() == matricula);
+ }
+
+ /**
+ * Ordenação Natural por Nome (Comparable).
+ */
+ public Set exibirAlunosPorNome() {
+ return new TreeSet<>(alunoSet);
+ }
+
+ /**
+ * Ordenação Customizada por Nota usando Streams.
+ */
+ public Set exibirAlunosPorNota() {
+ return alunoSet.stream()
+ .sorted(Aluno.porNota())
+ .collect(Collectors.toUnmodifiableSet());
+ }
+
+ /**
+ * Exemplo de uso de SequencedSet para ordem de inserção determinística.
+ */
+ public SequencedSet exibirAlunosOrdemInsercao() {
+ return new LinkedHashSet<>(alunoSet);
+ }
+
+ public static void main(String[] args) {
+ GerenciadorAlunos gerenciadorAlunos = new GerenciadorAlunos();
+
+ gerenciadorAlunos.adicionarAluno("Alice", 123456L, 6.7);
+ gerenciadorAlunos.adicionarAluno("Bob", 123457L, 9.0);
+ gerenciadorAlunos.adicionarAluno("Charlie", 123458L, 5.0);
+ gerenciadorAlunos.adicionarAluno("David", 123459L, 8.1);
+
+ System.out.println("Alunos (HashSet): " + gerenciadorAlunos.alunoSet);
+ System.out.println("Por Nome (Natural): " + gerenciadorAlunos.exibirAlunosPorNome());
+ System.out.println("Por Nota (Custom): " + gerenciadorAlunos.exibirAlunosPorNota());
+ }
+}
+
+/**
+ * Record Aluno: Inmutabilidad nativa.
+ * Identidad basada en matrícula.
+ */
+record Aluno(String nome, long matricula, double media) implements Comparable {
+ @Override
+ public int compareTo(Aluno a) {
+ return nome.compareToIgnoreCase(a.nome());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Aluno aluno)) return false;
+ return matricula == aluno.matricula;
+ }
+
+ @Override
+ public int hashCode() {
+ return java.util.Objects.hash(matricula);
+ }
+
+ public static java.util.Comparator porNota() {
+ return java.util.Comparator.comparingDouble(Aluno::media);
+ }
+}
diff --git a/src/main/java/me/dio/collections/set/ordenacao/Produto.java b/src/main/java/me/dio/collections/set/ordenacao/Produto.java
new file mode 100644
index 0000000..c053b63
--- /dev/null
+++ b/src/main/java/me/dio/collections/set/ordenacao/Produto.java
@@ -0,0 +1,48 @@
+package me.dio.collections.set.ordenacao;
+
+import java.util.Comparator;
+import java.util.Objects;
+
+/**
+ * Record Produto: Inmutabilidad nativa.
+ * Refactor de Portabilidad: Desempate en compareTo para evitar pérdida de elementos en TreeSet.
+ */
+public record Produto(long codigo, String nome, double preco, int quantidade)
+ implements Comparable {
+
+ /**
+ * Contrato Comparable Robusto:
+ * Si los nombres son iguales, utiliza el código como desempate (Unique Identifier).
+ * Esto evita que un TreeSet considere dos productos diferentes como "iguales" solo por el nombre.
+ */
+ @Override
+ public int compareTo(Produto p) {
+ int result = this.nome.compareToIgnoreCase(p.nome());
+ if (result == 0) {
+ return Long.compare(this.codigo, p.codigo());
+ }
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Produto produto)) return false;
+ return codigo == produto.codigo;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(codigo);
+ }
+
+ public static Comparator porPreco() {
+ return Comparator.comparingDouble(Produto::preco)
+ .thenComparingLong(Produto::codigo); // Desempate por código en el comparador también
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Produto[id=%d, nome=%s, preco=%.2f]", codigo, nome, preco);
+ }
+}
diff --git a/src/test/java/me/dio/collections/list/ordenacao/OrdenacaoPessoasTest.java b/src/test/java/me/dio/collections/list/ordenacao/OrdenacaoPessoasTest.java
new file mode 100644
index 0000000..c93abaf
--- /dev/null
+++ b/src/test/java/me/dio/collections/list/ordenacao/OrdenacaoPessoasTest.java
@@ -0,0 +1,47 @@
+package me.dio.collections.list.ordenacao;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.*;
+
+@DisplayName("Suite de Pruebas de Ingeniería - OrdenacaoPessoas (Sequenced Collections)")
+class OrdenacaoPessoasTest {
+
+ private OrdenacaoPessoas ordenacao;
+
+ @BeforeEach
+ void setUp() {
+ ordenacao = new OrdenacaoPessoas();
+ ordenacao.adicionarPessoa("Alice", 20, 1.56);
+ ordenacao.adicionarPessoa("Bob", 30, 1.80);
+ ordenacao.adicionarPessoa("Charlie", 25, 1.70);
+ }
+
+ @Test
+ @DisplayName("Debe validar el orden inverso usando Sequenced Collections (Java 21+)")
+ void deveValidarOrdemInversa() {
+ List listaInversa = ordenacao.obtenerListaInvertida();
+
+ // El último elemento añadido fue Charlie (insertion order)
+ // Por lo tanto, el primero en la lista inversa debe ser Charlie
+ assertThat(listaInversa.getFirst().nome()).isEqualTo("Charlie");
+ assertThat(listaInversa.getLast().nome()).isEqualTo("Alice");
+ }
+
+ @Test
+ @DisplayName("Debe validar ordenación fluida por altura")
+ void deveValidarOrdenacaoPorAltura() {
+ List porAltura = ordenacao.ordenarPorAltura();
+
+ assertThat(porAltura)
+ .extracting(Pessoa::altura)
+ .isSorted();
+
+ assertThat(porAltura.getFirst().nome()).isEqualTo("Alice"); // 1.56
+ assertThat(porAltura.getLast().nome()).isEqualTo("Bob"); // 1.80
+ }
+}
diff --git a/src/test/java/me/dio/collections/map/operacoes/AgendaContatosTest.java b/src/test/java/me/dio/collections/map/operacoes/AgendaContatosTest.java
new file mode 100644
index 0000000..4afc053
--- /dev/null
+++ b/src/test/java/me/dio/collections/map/operacoes/AgendaContatosTest.java
@@ -0,0 +1,47 @@
+package me.dio.collections.map.operacoes;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.*;
+
+@DisplayName("Suite de Pruebas de Ingeniería - AgendaContatos (Modern Map API)")
+class AgendaContatosTest {
+
+ private AgendaContatos agenda;
+
+ @BeforeEach
+ void setUp() {
+ agenda = new AgendaContatos();
+ agenda.adicionarContato("Camila", 123456);
+ agenda.adicionarContato("João", 5665);
+ }
+
+ @Test
+ @DisplayName("Debe retornar un Optional vacío al buscar contacto inexistente")
+ void deveRetornarOptionalVazioParaContatoInexistente() {
+ Optional resultado = agenda.pesquisarPorNome("Maria");
+
+ assertThat(resultado).isEmpty();
+ }
+
+ @Test
+ @DisplayName("Debe encontrar contacto existente usando Optional (Java 8+)")
+ void deveEncontrarContatoExistente() {
+ Optional resultado = agenda.pesquisarPorNome("Camila");
+
+ assertThat(resultado).isPresent().hasValue(123456);
+ }
+
+ @Test
+ @DisplayName("Debe actualizar el teléfono si el nombre ya existe")
+ void deveAtualizarTelefoneExistente() {
+ agenda.adicionarContato("Camila", 999999);
+
+ Optional resultado = agenda.pesquisarPorNome("Camila");
+ assertThat(resultado).isPresent().hasValue(999999);
+ }
+}
diff --git a/src/test/java/me/dio/collections/set/ordenacao/CadastroProdutosTest.java b/src/test/java/me/dio/collections/set/ordenacao/CadastroProdutosTest.java
new file mode 100644
index 0000000..3f0b813
--- /dev/null
+++ b/src/test/java/me/dio/collections/set/ordenacao/CadastroProdutosTest.java
@@ -0,0 +1,80 @@
+package me.dio.collections.set.ordenacao;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static org.assertj.core.api.Assertions.*;
+
+@DisplayName("Suite de Pruebas de Ingeniería - CadastroProdutos (Java 25 Ready)")
+class CadastroProdutosTest {
+
+ private CadastroProdutos cadastro;
+
+ @BeforeEach
+ void setUp() {
+ cadastro = new CadastroProdutos();
+ cadastro.adicionarProduto(1L, "Smartphone", 1000.0, 10);
+ cadastro.adicionarProduto(2L, "Notebook", 1500.0, 5);
+ cadastro.adicionarProduto(3L, "Mouse", 30.0, 20);
+ cadastro.adicionarProduto(4L, "Teclado", 50.0, 15);
+ }
+
+ @Test
+ @DisplayName("Debe validar inmutabilidad de la colección devuelta")
+ void deveValidarInmutabilidad() {
+ final Set produtosPorPreco = cadastro.exibirProdutosPorPreco();
+ assertThatThrownBy(() -> produtosPorPreco.add(new Produto(5L, "Monitor", 800.0, 2)))
+ .isExactlyInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ @DisplayName("Debe soportar estrés de lectura concurrente con Virtual Threads y recolectar futuros")
+ void deveSuportarLeituraConcorrenteComVirtualThreads() throws Exception {
+ int numeroDeHilos = 1000;
+
+ try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
+ List> tareas = IntStream.range(0, numeroDeHilos)
+ .mapToObj(i -> (Callable) () -> {
+ Set ordenados = cadastro.exibirProdutosPorPreco();
+ assertThat(ordenados).hasSize(4);
+ assertThat(ordenados.iterator().next().preco()).isEqualTo(30.0);
+ return true;
+ })
+ .toList();
+
+ List> futuros = executor.invokeAll(tareas);
+
+ for (Future f : futuros) {
+ assertThat(f.get()).isTrue();
+ }
+ }
+ }
+
+ @Test
+ @DisplayName("Debe validar el orden determinista por nombre (Natural Order)")
+ void deveValidarOrdenacaoNatural() {
+ Set porNome = cadastro.exibirProdutosPorNome();
+ assertThat(porNome)
+ .extracting(Produto::nome)
+ .containsExactly("Mouse", "Notebook", "Smartphone", "Teclado");
+ }
+
+ @Test
+ @DisplayName("Debe desempatar por código en compareTo para evitar pérdida de datos")
+ void deveDesempatarPorCodigoNoCompareTo() {
+ cadastro.adicionarProduto(10L, "Smartphone", 2000d, 1);
+
+ Set todos = cadastro.exibirProdutosPorNome();
+ assertThat(todos).hasSize(5);
+ assertThat(todos).extracting(Produto::codigo).contains(1L, 10L);
+ }
+}