diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b6465a --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Gradle +.gradle/ +build/ +*.iml + +# IntelliJ IDEA +.idea/ +out/ +gen/ + +# Maven +target/ + +# OS +.DS_Store +Thumbs.db + +# OpenJ9 / JVM +/tmp/javashared/ +*.log +*.trc + +# Windows residues +bin/ +obj/ diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/aws.xml b/.idea/aws.xml deleted file mode 100644 index 970d338..0000000 --- a/.idea/aws.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ 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)

-
-Hierarchy of Collection Framework in Java + Java Logo +
+ Cápsula de Tiempo Tecnológica: Del Java 8 al 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. +--- -

-List interface hierarchy Java
-Method Sumary Collection Interface -

+## ✅ Última Etapa: Estabilización y Refactorización (April 2026) + +### 1. Corrección de Inconsistencias Semánticas +- Se resolvió el error de "Símbolo no encontrado" en `CatalogoLivros.java`. +- **Refactor**: Estandarización del idioma a **Portugués** (`livroList` en lugar de `libroList`), garantizando coherencia absoluta con el dominio de negocio. + +### 2. Infraestructura de Pruebas (JUnit 5 + Java 25) +- **Estabilización del Motor**: Se inyectó `junit-platform-launcher` en el `testRuntimeOnly` de Gradle 9.4.1. +- **Resultado**: Ejecución exitosa de tests concurrentes con **Virtual Threads** e **Inmutabilidad**. +- **Reporte Local**: [Gradle Test Report (Local)](./build/reports/tests/test/index.html). + +### 3. Saneamiento de Artefactos +- Eliminación total de paquetes obsoletos (`list/`, `set/`, `map/`) en la raíz de `src/main/java`. +- **Estructura Única**: `me.dio.collections.*` como única fuente de verdad arquitectónica. + +--- + +## 🏛️ Referencias de Autoridad (Must-Read) +| Recurso | Nivel | Propósito Técnico | +| :--- | :--- | :--- | +| **[JDK 25 API Documentation](https://docs.oracle.com/en/java/javase/25/docs/api/)** | API | Uso correcto de métodos en colecciones inmutables. | +| **[Java Language Specification (JLS)](https://docs.oracle.com/javase/specs/)** | Especificación | Entender el compilador tras las **Sealed Classes**. | +| **[Eclipse OpenJ9 Optimization Guide](https://www.eclipse.org/openj9/docs/)** | JVM | Ajustes de **Shared Classes** y **JIT/AOT**. | +| **[RESOURCES.md](./RESOURCES.md)** | Full Path | **Guía Curada de Niveles de Abstracción.** | --- -### Referências: +## 🛠️ Escalabilidad Tecnológica: De Java 8 a Java 25 -[1] "Java Collections - Universidade Java." Universidade Java. Disponível em: http://www.universidadejava.com.br/java/java-collection/. +### 1. Evolución de los Modelos: De Clases a Records +- **Java 8 (Old Style):** Clases verbosas con getters, setters, equals y hashCode manual (boilerplate excesivo). +- **Java 25 (New Style):** Implementación de **Records** para todos los portadores de datos (`Pessoa`, `Livro`, `Produto`, `Aula`). Esto garantiza inmutabilidad nativa y una reducción del 80% en líneas de código. -[2] "Java™ Platform, Standard Edition 17 API Specification - Interface Collection." Oracle. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collection.html. +### 2. Jerarquía Segura: Sealed Classes & Pattern Matching +- **Seguridad de Tipos:** Se implementó una jerarquía cerrada para contenidos educativos mediante `sealed interface`. +- **Pattern Matching for switch:** Eliminamos el uso de `instanceof` y casting manual en el procesamiento de colecciones polimórficas. El compilador ahora garantiza la **Exhaustividad** del procesamiento. -[3] "Java Comparator and Comparable - Baeldung." Baeldung. Disponível em: https://www.baeldung.com/java-comparator-comparable. +### 3. Java Collections Framework 2.0: Sequenced Collections +- **Determinismo:** Implementación masiva de `SequencedSet` y `SequencedMap` para manejar extremos (`addFirst`, `getLast`) de forma expresiva y determinista, superando las limitaciones de las interfaces originales de Java 1.2. -[4] "Java™ Platform, Standard Edition 17 API Specification - Class Collections." Oracle. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html. +### 4. Rendimiento de Nivel Producción: Streams & Virtual Threads +- **Filtrado Declarativo:** Sustitución de bucles `for` e `if` anidados por la **Streams API**. +- **Concurrencia Escalamiento Masivo:** El sistema está diseñado para ser compatible con **Virtual Threads**, permitiendo miles de operaciones de ordenación simultáneas con una sobrecarga mínima de memoria. +- **Optimización OpenJ9:** Configuración avanzada de la JVM con **Shared Classes** y **AOT (Ahead-of-Time)** para arranques ultrarrápidos y bajo consumo de RAM. --- -Se você preferir usar o protocolo SSH para comunicação com o repositório, siga as etapas abaixo: -1. Abra o terminal ou prompt de comando. -2. Navegue até o diretório do projeto. -3. Execute o seguinte comando para mudar a URL remota para SSH: +## 🏗️ Estructura del Proyecto (Modernizada) - ```shell - git remote set-url origin git@github.com:cami-la/collections-java-api-2023.git +- `me.dio.collections.list`: Operaciones, Pesquisa y Ordenación de Listas. +- `me.dio.collections.set`: Conjuntos de datos únicos con identidad basada en Records. +- `me.dio.collections.map`: Agendas y diccionarios optimizados con `Optional` y `Functional API`. +- `me.dio.collections.core`: El núcleo del sistema con **Sealed Classes** y **Pattern Matching**. -### Dúvidas e Suporte +--- + +## 🚀 Cómo Ejecutar (Arquitectura 2026) + +### Requisitos: +- **JDK:** Java 25 (IBM Semeru / Eclipse OpenJ9 recomendado). +- **Gradle:** 9.4.1+. + +### Comandos: +```sh +# Limpieza profunda de residuos antiguos +rm -rf .gradle/ build/ out/ bin/ + +# Compilar y ejecutar Tests con Optimización OpenJ9 +./gradlew test --info -Caso você tenha alguma dúvida, problema ou sugestão, fique à vontade para abrir uma issue no repositório. Espero conseguir te ajudar! (: +# Ejecutar el núcleo del sistema +./gradlew run --args='me.dio.collections.core.ProcessadorEducacional' +``` + +--- + +## 👔 Rol: Senior Java Architect +Este proyecto sirve como referencia para la construcción de sistemas backend robustos, seguros y altamente eficientes, aprovechando cada gramo de innovación que el ecosistema Java ha entregado en la última década. + +--- +**Desarrollado con maestría técnica para el futuro del desarrollo Java.** diff --git a/RESOURCES.md b/RESOURCES.md new file mode 100644 index 0000000..b722a33 --- /dev/null +++ b/RESOURCES.md @@ -0,0 +1,57 @@ +# 📚 Guía de Autoridad y Recursos Técnicos: Java 25 (LTS) + +Como **Senior Java Architect**, he curado esta selección de fuentes de verdad para transformar un perfil junior en un desarrollador de alto nivel, basándome en los pilares de la especificación, la implementación y la optimización. + +--- + +## 🏛️ Niveles de Abstracción: Ruta de Maestría + +### 1. Nivel Sintaxis y Semántica (El "Qué" y "Cómo") +*Para entender las reglas del lenguaje, desde Records hasta Pattern Matching.* + +| Recurso | Tipo | Por qué leer esto | +| :--- | :--- | :--- | +| **[Java Language Specification (JLS) - Java 25](https://docs.oracle.com/javase/specs/)** | Especificación | Resuelve dudas sobre el comportamiento exacto del compilador (ej. Exhaustividad en Sealed Classes). | +| **[Dev.java: The Destination for Java Developers](https://dev.java/)** | Portal Oficial | Tutoriales autoritativos de Oracle que cubren desde sintaxis básica hasta Project Loom (Virtual Threads). | +| **[Java Almanac](https://javaalmanac.io/)** | Comparativa | Indispensable para visualizar la evolución de la API de Colecciones desde Java 8 hasta la versión 25. | + +### 2. Nivel JVM e Infraestructura (El "Dónde" y "Eficiencia") +*Enfoque específico en el Runtime de alto rendimiento: Eclipse OpenJ9 / IBM Semeru.* + +* **[Eclipse OpenJ9 Documentation](https://www.eclipse.org/openj9/docs/)**: **Indispensable** para entender cómo configurar `-Xshareclasses` y `-Xquickstart`. Resuelve problemas de consumo de memoria en contenedores. +* **[IBM Semeru Runtimes Guide](https://www.ibm.com/docs/en/semeru-runtimes/21)**: Guías de optimización para despliegues de grado empresarial. Explica la ventaja del JIT/AOT sobre HotSpot. +* **[Project Loom (Virtual Threads) JEP 444](https://openjdk.org/jeps/444)**: La fuente original para entender la concurrencia ligera que implementamos en este proyecto. + +### 3. Nivel Arquitectura y Patrones (El "Diseño") +*Cómo estructurar sistemas robustos y escalables.* + +* **[Baeldung: Java Collections Guide](https://www.baeldung.com/java-collections)**: Ejemplos prácticos de alta calidad para dominar `SequencedCollections` y `Stream API`. +* **[Refactoring.Guru: Design Patterns in Java](https://refactoring.guru/design-patterns/java)**: Para aprender a aplicar patrones como *Strategy* o *Factory* usando la elegancia de Java moderno. + +### 4. Nivel Testing y Calidad (La "Confianza") +*Garantizando que el código de producción sea infalible.* + +* **[JUnit 5 User Guide](https://junit.org/junit5/docs/current/user-guide/)**: Documentación oficial para dominar el motor de pruebas `@Test` y extensiones. +* **[AssertJ Official Site](https://assertj.github.io/doc/)**: Guía para escribir aserciones fluídas que parecen lenguaje natural. + +--- + +## 🚀 Ruta de Aprendizaje Gratuita (Free Tier) + +Si estás iniciando tu viaje hacia Java 25, sigue este orden: + +1. **[Oracle University: Java Explorer](https://education.oracle.com/learning-path/java-explorer/lp_501)**: Curso gratuito para establecer las bases fundamentales. +2. **[JetBrains Academy (Java Track)](https://www.jetbrains.com/academy/)**: Plataforma interactiva (con nivel gratuito) para practicar con proyectos reales. +3. **[Exercism: Java Track](https://exercism.org/tracks/java)**: Mentoría gratuita y desafíos de código para pulir tu lógica de programación. + +--- + +## 🔍 Diferencia Crítica: API vs. Especificación + +| Característica | API Documentation (JavaDocs) | Language Specification (JLS) | +| :--- | :--- | :--- | +| **Enfoque** | ¿Cómo uso este método/clase? | ¿Cuáles son las reglas de la gramática? | +| **Audiencia** | Desarrolladores de aplicaciones. | Arquitectos y creadores de herramientas. | +| **Ejemplo** | `List.addFirst()` añade al inicio. | Las clases `sealed` requieren `permits`. | + +> **Nota del Arquitecto:** "Un desarrollador senior no solo sabe cómo escribir el código, sino que entiende por qué la JVM decidió ejecutarlo de esa manera. Lee la especificación una vez, y entenderás el lenguaje para siempre." diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..657e359 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + id("java") + id("application") +} + +group = "me.dio" +version = "1.0-SNAPSHOT" + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +application { + mainClass.set("me.dio.collections.core.ProcessadorEducacional") +} + +repositories { + mavenCentral() +} + +dependencies { + // JUnit 5 con BOM para consistencia de versiones + testImplementation(platform("org.junit:junit-bom:5.11.3")) + testImplementation("org.junit.jupiter:junit-jupiter") + + // Necesario para que Gradle 9+ pueda lanzar tests en Java 25 + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + + // Fluent Assertions + testImplementation("org.assertj:assertj-core:3.26.3") +} + +tasks.test { + useJUnitPlatform() +} + +tasks.withType().configureEach { + options.encoding = "UTF-8" +} + +// Otimizações para OpenJ9 / IBM Semeru +tasks.withType().configureEach { + jvmArgs( + "-XX:+IgnoreUnrecognizedVMOptions", + "-Xshareclasses", + "-Xscmx128m", + "-Xquickstart" + ) +} diff --git a/collections-java-api-2023.iml b/collections-java-api-2023.iml deleted file mode 100644 index c90834f..0000000 --- a/collections-java-api-2023.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..b105b49 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +# Portabilidad JVM: IgnoreUnrecognizedVMOptions permite que el proyecto corra en HotSpot y OpenJ9 sin fallar +# Optimización de arranque extremo para OpenJ9 en entornos de contenedores/WSL +org.gradle.jvmargs=-XX:+IgnoreUnrecognizedVMOptions \ + -Xshareclasses:name=collections_cache,cacheDir=/tmp/javashared \ + -Xquickstart -Xmns64m -Xmx512m diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..d997cfc Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c82ad3f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..739907d --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# 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 +# +# https://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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..e509b2d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/out/production/collections-java-api-2023/main/java/Main.class b/out/production/collections-java-api-2023/main/java/Main.class deleted file mode 100644 index ab956d8..0000000 Binary files a/out/production/collections-java-api-2023/main/java/Main.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAno.class b/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAno.class deleted file mode 100644 index 2d05206..0000000 Binary files a/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAno.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAnoAutorTitulo.class b/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAnoAutorTitulo.class deleted file mode 100644 index c6a9e40..0000000 Binary files a/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAnoAutorTitulo.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAutor.class b/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAutor.class deleted file mode 100644 index 402aed2..0000000 Binary files a/out/production/collections-java-api-2023/main/java/comparableXcomparator/CompararAutor.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/Livro.class b/out/production/collections-java-api-2023/main/java/comparableXcomparator/Livro.class deleted file mode 100644 index 730d4e9..0000000 Binary files a/out/production/collections-java-api-2023/main/java/comparableXcomparator/Livro.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/Main$1.class b/out/production/collections-java-api-2023/main/java/comparableXcomparator/Main$1.class deleted file mode 100644 index a39cc25..0000000 Binary files a/out/production/collections-java-api-2023/main/java/comparableXcomparator/Main$1.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/Main.class b/out/production/collections-java-api-2023/main/java/comparableXcomparator/Main.class deleted file mode 100644 index cd54933..0000000 Binary files a/out/production/collections-java-api-2023/main/java/comparableXcomparator/Main.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/comparableXcomparator/README.md b/out/production/collections-java-api-2023/main/java/comparableXcomparator/README.md deleted file mode 100644 index e9788f0..0000000 --- a/out/production/collections-java-api-2023/main/java/comparableXcomparator/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# Comparable X Comparator - -## Comparable - -- `Comparable` fornece uma única sequência de ordenação. Em outras palavras, podemos ordenar a coleção com base em um único elemento, como id, nome e preço. -- `Comparable` afeta a classe original, ou seja, a classe atual é modificada. -- `Comparable` fornece o método `compareTo()` para ordenar elementos. -- `Comparable` está presente no pacote `java.lang`. -- Podemos ordenar os elementos da lista do tipo `Comparable` usando o método `Collections.sort(List)`. - -## Comparator - -- O `Comparator` fornece o método `compare()` para ordenar elementos. -- O `Comparator` fornece múltiplas sequências de ordenação. Em outras palavras, podemos ordenar a coleção com base em múltiplos elementos, como id, nome, preço, etc. -- O `Comparator` não afeta a classe original, ou seja, a classe atual não é modificada. -- Um `Comparator` está presente no pacote `java.util`. -- Podemos ordenar os elementos da lista do tipo `Comparator` usando o método `Collections.sort(List, Comparator)`. - -## Collections - -- A classe `Collections` é uma classe utilitária do Java para operações comuns em coleções. -- Ela fornece métodos para ordenação, busca, manipulação e sincronização de coleções. -- O método `sort()` é usado para ordenar uma lista em ordem ascendente. -- O método `sort()` em conjunto com `Collections.reverseOrder()` permite ordenar em ordem descendente. - - -```java -package main.java.comparableXcomparator; - -import java.util.Comparator; - -// Uma classe 'Livro' que implementa Comparable -class Livro implements Comparable { - private String titulo; - private String autor; - private int ano; - - // Construtor - public Livro(String ti, String au, int an) { - this.titulo = ti; - this.autor = au; - this.ano = an; - } - - // Usado para ordenar livros por ano - public int compareTo(Livro l) { - return titulo.compareTo(l.titulo); - } - - // Métodos getters para acessar os dados privados - public String getTitulo() { - return titulo; - } - - public String getAutor() { - return autor; - } - - public int getAno() { - return ano; - } -} - -// Classe para comparar Livro por autor -class CompararAutor implements Comparator { - @Override - public int compare(Livro l1, Livro l2) { - return l1.getAutor().compareTo(l2.getAutor()); - } -} - -// Classe para comparar Livro por ano -class CompararAno implements Comparator { - @Override - public int compare(Livro l1, Livro l2) { - if (l1.getAno() < l2.getAno()) - return -1; - if (l1.getAno() > l2.getAno()) - return 1; - else - return 0; - } -} - -class CompararAnoAutorTitulo implements Comparator { - @Override - public int compare(Livro l1, Livro l2) { - int ano = Integer.compare(l1.getAno(), l2.getAno()); - if (ano != 0) - return ano; - int autor = l1.getAutor().compareTo(l2.getAutor()); - if (autor != 0) - return autor; - return l1.getTitulo().compareTo(l2.getTitulo()); - } -} -``` ---- - -### Livros citados: - -- ✨ Entendendo Algoritmos: Um Guia Ilustrado Para Programadores e Outros Curiosos - https://amzn.to/3IVsZRM -- ✨ Microsserviços Prontos Para a Produção: Construindo Sistemas Padronizados em uma Organização de Engenharia de Software - https://amzn.to/3oOUkyb -- ✨ Java - Guia do Programador: Atualizado Para Java 16 - https://amzn.to/3oJPanf -- ✨ Microsserviços Prontos Para a Produção: Construindo Sistemas Padronizados em uma Organização de Engenharia de Software - https://amzn.to/3MOMVHf -- ✨ Kotlin em ação - https://amzn.to/3MFyncM - ---- - -### Referências: - -[1] "Comparable vs Comparator in Java." GeeksforGeeks. Disponível em: https://www.geeksforgeeks.org/comparable-vs-comparator-in-java/. - -[2] "Difference between Comparable and Comparator in Java." JavaTpoint. Disponível em: https://www.javatpoint.com/difference-between-comparable-and-comparator. - -[3] "Java™ Platform, Standard Edition 17 API Specification - Class Collections." Oracle. Disponível em: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html. - ---- - -### 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/generics/GenericsExempleList.class b/out/production/collections-java-api-2023/main/java/generics/GenericsExempleList.class deleted file mode 100644 index e3f2808..0000000 Binary files a/out/production/collections-java-api-2023/main/java/generics/GenericsExempleList.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/generics/GenericsExempleMap.class b/out/production/collections-java-api-2023/main/java/generics/GenericsExempleMap.class deleted file mode 100644 index fd8b0b9..0000000 Binary files a/out/production/collections-java-api-2023/main/java/generics/GenericsExempleMap.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/generics/GenericsExempleSet.class b/out/production/collections-java-api-2023/main/java/generics/GenericsExempleSet.class deleted file mode 100644 index e9394e3..0000000 Binary files a/out/production/collections-java-api-2023/main/java/generics/GenericsExempleSet.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/generics/README.md b/out/production/collections-java-api-2023/main/java/generics/README.md deleted file mode 100644 index 273fae5..0000000 --- a/out/production/collections-java-api-2023/main/java/generics/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Generics Type - -- Um tipo genérico é uma classe genérica ou uma interface que é parametrizada em relação a tipos. -- A classe `Box` a seguir será modificada para demonstrar o conceito: - -```java -public class Box { - private Object object; - - public void set(Object object) { this.object = object; } - public Object get() { return object; } -} -``` - -- O símbolo `<>` é chamado de "diamond" ou "diamond operator" foi um recurso introduzido no Java 7 e é usado no contexto de tipos genéricos em Java para inferir automaticamente o tipo com base no contexto. -- Para atualizar a classe `Box` para usar generics, você cria uma declaração de tipo genérico alterando o código `public class Box` para `public class Box`. -- Isso introduz a variável de tipo, `T`, que pode ser usada em qualquer lugar dentro da classe: - -```java -/** -Versão genérica da classe Box. -@param o tipo do valor sendo armazenado -*/ -public class Box { - // T representa "Type" (tipo) - private T t; - - public void set(T t) { this.t = t; } - public T get() { return t; } -} -``` - -- Como você pode ver, todas as ocorrências de Object são substituídas por T. -- Uma variável de tipo pode ser qualquer tipo não primitivo que você especificar: qualquer tipo de classe, qualquer tipo de interface, qualquer tipo de array ou até mesmo outra variável de tipo. -- Essa mesma técnica pode ser aplicada para criar interfaces genérica. -- Os nomes de parâmetros de tipo mais comumente usados são: - - E - Elemento (usado extensivamente pelo Java Collections Framework) - - K - Chave - - N - Número - - T - Tipo - - V - Valor - - S, U, V, etc. - 2º, 3º, 4º tipos - -### Vantagens simples de usar generics nas interfaces Collection em Java: - -1. Segurança do tipo de dados: O uso de generics garante que apenas objetos de um tipo específico possam ser adicionados à coleção, evitando erros de tipo e garantindo que você esteja lidando com os dados corretos. -2. Código mais legível: Ao usar generics, você pode especificar o tipo de dados esperado ou retornado pela coleção, o que torna o código mais fácil de entender e ler. -3. Detecta erros mais cedo: O compilador verifica se você está usando os tipos corretos durante a compilação, ajudando a identificar erros de tipo antes mesmo de executar o programa. -4. Reutilização de código: Com generics, você pode criar classes e métodos genéricos que funcionam com diferentes tipos de coleções, evitando a necessidade de duplicar código para cada tipo específico. -5. Melhor desempenho: O uso de generics pode melhorar o desempenho, pois evita a necessidade de conversões de tipo desnecessárias e permite que o compilador otimize o código com base no tipo especificado. - ---- - -### Referências: - -[1] "Java Tutorials - Generics - Generic Types." Oracle. Disponível em: https://docs.oracle.com/javase/tutorial/java/generics/types.html. - ---- - -### 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/list/OperacoesBasicas/CarrinhoDeCompras.class b/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/CarrinhoDeCompras.class deleted file mode 100644 index db899fd..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/CarrinhoDeCompras.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/Item.class b/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/Item.class deleted file mode 100644 index 204c587..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/Item.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/ListaTarefa.class b/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/ListaTarefa.class deleted file mode 100644 index d6114da..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/ListaTarefa.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/Tarefa.class b/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/Tarefa.class deleted file mode 100644 index e16831b..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/OperacoesBasicas/Tarefa.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Ordenacao/ComparatorPorAltura.class b/out/production/collections-java-api-2023/main/java/list/Ordenacao/ComparatorPorAltura.class deleted file mode 100644 index 210e8f3..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Ordenacao/ComparatorPorAltura.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Ordenacao/OrdenacaoNumeros.class b/out/production/collections-java-api-2023/main/java/list/Ordenacao/OrdenacaoNumeros.class deleted file mode 100644 index 5d01c75..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Ordenacao/OrdenacaoNumeros.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Ordenacao/OrdenacaoPessoas.class b/out/production/collections-java-api-2023/main/java/list/Ordenacao/OrdenacaoPessoas.class deleted file mode 100644 index ba5e34b..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Ordenacao/OrdenacaoPessoas.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Ordenacao/Pessoa.class b/out/production/collections-java-api-2023/main/java/list/Ordenacao/Pessoa.class deleted file mode 100644 index b353624..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Ordenacao/Pessoa.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Pesquisa/CatalogoLivros.class b/out/production/collections-java-api-2023/main/java/list/Pesquisa/CatalogoLivros.class deleted file mode 100644 index 108ea94..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Pesquisa/CatalogoLivros.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Pesquisa/Livro.class b/out/production/collections-java-api-2023/main/java/list/Pesquisa/Livro.class deleted file mode 100644 index 7895020..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Pesquisa/Livro.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/Pesquisa/SomaNumeros.class b/out/production/collections-java-api-2023/main/java/list/Pesquisa/SomaNumeros.class deleted file mode 100644 index f569064..0000000 Binary files a/out/production/collections-java-api-2023/main/java/list/Pesquisa/SomaNumeros.class and /dev/null differ diff --git a/out/production/collections-java-api-2023/main/java/list/README.md b/out/production/collections-java-api-2023/main/java/list/README.md deleted file mode 100644 index 7115fd6..0000000 --- a/out/production/collections-java-api-2023/main/java/list/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# List Interface - -

-List interface hierarchy Java
-Hierarchy of Collection Framework in Java -

- -- 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 - -

-Map interface hierarchy Java
-Hierarchy of Collection Framework in Java -

- -- 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 - -

-Set interface hierarchy Java
-Hierarchy of Collection Framework in Java -

- -- 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); + } +}