{"id":15068992,"url":"https://github.com/tibetteixeira/learning-java-features","last_synced_at":"2026-01-03T13:05:34.023Z","repository":{"id":212220645,"uuid":"720868759","full_name":"tibetteixeira/learning-java-features","owner":"tibetteixeira","description":"Repositorio sobre principais features do Java ","archived":false,"fork":false,"pushed_at":"2024-08-14T05:29:15.000Z","size":75,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T21:32:37.808Z","etag":null,"topics":["java","java-11","java-15","java-8","java-features"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tibetteixeira.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-19T20:50:45.000Z","updated_at":"2024-08-14T05:29:18.000Z","dependencies_parsed_at":"2024-10-13T04:40:50.091Z","dependency_job_id":null,"html_url":"https://github.com/tibetteixeira/learning-java-features","commit_stats":null,"previous_names":["tibetteixeira/learning-java-features"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibetteixeira%2Flearning-java-features","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibetteixeira%2Flearning-java-features/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibetteixeira%2Flearning-java-features/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibetteixeira%2Flearning-java-features/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tibetteixeira","download_url":"https://codeload.github.com/tibetteixeira/learning-java-features/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243848993,"owners_count":20357686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","java-11","java-15","java-8","java-features"],"created_at":"2024-09-25T01:39:58.414Z","updated_at":"2026-01-03T13:05:33.941Z","avatar_url":"https://github.com/tibetteixeira.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Features do Java (7 ao 17)\n\nEste repositório contém um mapeamento das principais características e mudanças nas versões do Java de 8 a 17. O objetivo é fornecer uma visão clara das evoluções e melhorias em cada versão.\n\n## Sumário\n\n- [Java 7](#java-7)\n- [Java 8](#java-8)\n- [Java 9](#java-9)\n- [Java 10](#java-10)\n- [Java 11](#java-11)\n- [Java 12](#java-12)\n- [Java 13](#java-13)\n- [Java 14](#java-14)\n- [Java 15](#java-15)\n- [Java 16](#java-16)\n- [Java 17](#java-17)\n\n---\n\n## Java 7\n- **Data de Lançamento**: Julho de 2011\n- **Principais Features**:\n  - **Try-with-resources**: Introduz um novo recurso para gerenciar recursos como streams, conexões e arquivos, que são automaticamente fechados após o uso. Isso reduz a necessidade de blocos `finally` para fechar recursos.\n    - **Exemplo**:\n      ```java\n      try (BufferedReader br = new BufferedReader(new FileReader(\"file.txt\"))) {\n          String line;\n          while ((line = br.readLine()) != null) {\n              System.out.println(line);\n          }\n      } catch (IOException e) {\n          e.printStackTrace();\n      }\n      ```\n  - **Multi-catch**: Permite capturar várias exceções em um único bloco `catch`, simplificando o tratamento de múltiplas exceções semelhantes.\n    - **Exemplo**:\n      ```java\n      try {\n          // código que pode lançar várias exceções\n      } catch (IOException | SQLException e) {\n          e.printStackTrace();\n      }\n      ```\n  - **Strings em switch**: Permite usar strings como expressão de caso em instruções `switch`.\n    - **Exemplo**:\n      ```java\n      String day = \"Monday\";\n      switch (day) {\n          case \"Monday\":\n              System.out.println(\"Start of the week\");\n              break;\n          case \"Friday\":\n              System.out.println(\"End of the week\");\n              break;\n          default:\n              System.out.println(\"Midweek\");\n              break;\n      }\n      ```\n  - **Binary Literals**: Permite a representação de literais binários com o prefixo `0b` ou `0B`.\n    - **Exemplo**:\n      ```java\n      int binaryValue = 0b1010; // 10 em decimal\n      System.out.println(binaryValue); // Output: 10\n      ```\n  - **Underscores em Literais Numéricos**: Permite o uso de underscores (`_`) em literais numéricos para melhorar a legibilidade.\n    - **Exemplo**:\n      ```java\n      int million = 1_000_000;\n      System.out.println(million); // Output: 1000000\n      ```\n  - **Automatic Resource Management (Try-with-resources)**: Facilita a declaração de múltiplos recursos no bloco `try`, garantindo que todos os recursos sejam fechados corretamente.\n    - **Exemplo**:\n      ```java\n      try (BufferedReader br = new BufferedReader(new FileReader(\"file.txt\"));\n           PrintWriter pw = new PrintWriter(new FileWriter(\"output.txt\"))) {\n          String line;\n          while ((line = br.readLine()) != null) {\n              pw.println(line);\n          }\n      } catch (IOException e) {\n          e.printStackTrace();\n      }\n      ```\n  - **NIO.2 (Java NIO Update)**: Introduzido como parte do Java 7, o NIO.2 expande a API de NIO (New I/O) com novas funcionalidades para manejo de arquivos e I/O.\n    - **Path API**: Introduz a classe `java.nio.file.Path` para representar caminhos de arquivos e diretórios, oferecendo uma maneira mais poderosa e flexível de manipular caminhos de arquivos em comparação com as antigas classes `File` e `FileSystem`.\n    - **Files API**: Adiciona a classe `java.nio.file.Files`, que contém métodos estáticos para operações de I/O com arquivos, como leitura e escrita de arquivos, além de outras operações relacionadas a arquivos e diretórios.\n    - **Watch Service**: Fornece a classe `java.nio.file.WatchService` para monitorar mudanças em diretórios e arquivos, permitindo a detecção de alterações em tempo real.\n    - **File Systems**: Suporte aprimorado para acessar e manipular diferentes sistemas de arquivos, incluindo operações como copiar e mover arquivos entre diretórios e sistemas de arquivos.\n## Java 8\n\n- **Data de Lançamento**: Março de 2014\n- **Principais Features**:\n    - **Expressões Lambda**: Facilita o desenvolvimento funcional com funções como objetos de primeira classe.\n    - **Streams API**: Permite processamento de coleções de forma declarativa.\n    - **Optional**: Fornece uma forma de representar valores que podem estar ausentes. É uma alternativa ao uso de `null` e ajuda a evitar `NullPointerExceptions`. Permite usar métodos como `ifPresent()`, `orElse()`, e `map()` para manipulação segura de valores.\n    - **Default Methods**: Métodos com implementação em interfaces.\n    - **Nashorn JavaScript Engine**: Substituição do Rhino, para execução mais eficiente de código JavaScript.\n    - **Nova API de Data e Hora**: `java.time`, para substituir as antigas classes `java.util.Date` e `java.util.Calendar`.\n    - **Functional Interfaces**: Introduz interfaces funcionais, como `Function`, `Consumer`, `Supplier`, e `Predicate`.\n\n\n## Java 9\n\n- **Data de Lançamento**: Setembro de 2017\n- **Principais Features**:\n    - **Módulos Java (Project Jigsaw)**: Introduz a modularização do código com o sistema de módulos.\n    - **JShell**: Um REPL (Read-Eval-Print Loop) para testes e desenvolvimento interativo.\n    - **API de Processos**: Melhorias no gerenciamento de processos e suas respectivas APIs.\n    - **Coleções Imutáveis**: Novos métodos de fábrica para coleções imutáveis.\n    - **takeWhile e dropWhile (Preview)**: Métodos para manipulação de fluxos, retornando subsequências de acordo com o predicado fornecido.\n    - **Atualizações do try-catch**: Introduz o recurso de múltiplos recursos no bloco `try`, simplificando o gerenciamento de recursos com `try-with-resources`.\n    - **Interfaces Privadas**: Adição de métodos privados em interfaces, permitindo a reutilização de código dentro da própria interface.\n\n\n## Java 10\n\n- **Data de Lançamento**: Março de 2018\n- **Principais Features**:\n    - **Var**: Introduz a inferência de tipo local para variáveis locais.\n    - **Garbage Collector Improvements**: Melhorias no coletor de lixo, especialmente o G1.\n    - **Application Class-Data Sharing**: Melhora o tempo de inicialização e o uso de memória.\n\n## Java 11\n\n- **Data de Lançamento**: Setembro de 2018\n- **Principais Features**:\n    - **API de String**: Novos métodos como `isBlank()`, `lines()`, `strip()`.\n    - **Local-Variable Syntax for Lambda Parameters**: Uso do `var` em parâmetros de lambdas.\n    - **HTTP Client**: Nova API para simplificar a comunicação HTTP.\n    - **Remoção de APIs**: APIs antigas como `Java EE` e `CORBA` foram removidas.\n    - **takeWhile e dropWhile**: Esses métodos, introduzidos como preview em Java 9, tornam-se padrão.\n    - **Atualizações em Files**:\n      - **Métodos em `Files`**: Introduz novos métodos na classe `Files`, como `writeString()` e `readString()`, para simplificar a leitura e escrita de arquivos como strings.\n      - **Exemplo**:\n        ```java\n        Path path = Paths.get(\"file.txt\");\n        Files.writeString(path, \"Hello, World!\");\n        String content = Files.readString(path);\n        System.out.println(content);\n        ```\n\n## Java 12\n\n- **Data de Lançamento**: Março de 2019\n- **Principais Features**:\n    - **Switch Expressions (Preview)**: Melhoria na sintaxe do switch.\n      - **Exemplo**:\n          ```java\n          String dayOfWeek = \"Monday\";\n          String typeDay = switch (dayOfWeek) {\n              case \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\" -\u003e \"business day\";\n              case \"Sunday\", \"Saturday\" -\u003e \"weekend\";\n              default -\u003e \"Invalid day: \" + dayOfWeek;\n          };\n          System.out.println(typeDay); // Output: business day\n          ```\n    - **JVM Constants API**: Nova API para trabalhar com constantes na JVM.\n    - **Garbage Collector Improvements**: Melhorias no G1 e suporte para o novo coletor de lixo Shenandoah.\n    - **compactNumberFormat**: Nova API para formatação compacta de números. Adiciona suporte à formatação de números em formas compactas, como abreviaturas (`1K`, `1M`, etc.).\n      - **Exemplo**:\n        ```java\n        NumberFormat compact = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);\n        System.out.println(compact.format(12345)); // Output: 12.3K\n        ```\n    - **fileMismatch**: Novo método na classe `Files` para comparar dois arquivos e determinar se eles são diferentes. Isso pode ser útil para verificar se dois arquivos são idênticos sem ler o conteúdo completo.\n      - **Exemplo**:\n        ```java\n        Path file1 = Paths.get(\"file1.txt\");\n        Path file2 = Paths.get(\"file2.txt\");\n        long mismatch = Files.mismatch(file1, file2);\n        if (mismatch == -1) {\n            System.out.println(\"Os arquivos são idênticos.\");\n        } else {\n            System.out.println(\"Os arquivos diferem na posição: \" + mismatch);\n        }\n        ```\n    - **String Methods**:\n      - **`indent()`**: Adiciona uma quantidade especificada de espaços em branco no início de cada linha de uma string.\n       - **Exemplo**:\n         ```java\n         String str = \"Hello\\nWorld\";\n         System.out.println(str.indent(4));\n         // Output:\n         //     Hello\n         //     World\n         ```\n      - **`transform()`**: Permite transformar uma string usando uma função fornecida.\n       - **Exemplo**:\n         ```java\n         String str = \"hello\";\n         String result = str.transform(s -\u003e s.toUpperCase());\n         Syst\n\n## Java 13\n\n- **Data de Lançamento**: Setembro de 2019\n- **Principais Features**:\n    - **Text Blocks (Preview)**: Suporte a blocos de texto multilinha.\n    - **Reimplementação do ZGC**: Melhorias na implementação do Z Garbage Collector.\n    - **Switch Expressions**: A funcionalidade de switch expressions, introduzida como preview em Java 12, torna-se uma característica padrão. Permite um uso mais conciso e expressivo do switch. Foi adicionada a palavra reservada `yield` para retornar o valor. O `break` foi abolido\n      - **Exemplo**:\n        ```java\n        int dayOfWeek = 2;\n        String dayName = switch (dayOfWeek) {\n            case 1:\n                yield \"Sunday\";\n            case 2:\n                yield \"Monday\";\n            case 3:\n                yield \"Tuesday\";\n            case 4:\n                yield \"Wednesday\";\n            case 5:\n                yield \"Thursday\";\n            case 6:\n                yield \"Friday\";\n            case 7:\n                yield \"Saturday\";\n            default:\n                yield \"Invalid day: \" + dayOfWeek;\n        };\n        System.out.println(dayName); // Output: Monday\n        ```\n\n## Java 14\n\n- **Data de Lançamento**: Março de 2020\n- **Principais Features**:\n    - **Records (Preview)**: Facilita a criação de classes de dados imutáveis.\n    - **Pattern Matching for instanceof (Preview)**: Simplifica a verificação de tipos e conversões.\n    - **NVD (Non-Volatile Variables)**: Suporte para variáveis não voláteis.\n    - **Text Blocks**: Foi adicionado mais dois caracteres `\\ ` e `\\s`.\n      - `\\ `: ignora quebra de linha e é utilizado apenas no final da linha\n      - `\\s`: utilizado para indicar espaço ao final da linha\n    - **NullPointerException**: Introdução de melhorias para diagnosticar e relatar exceções `NullPointerException`, com mensagens mais detalhadas sobre o que causou a exceção, melhorando a depuração.\n      - **Exemplo**: Mensagens detalhadas de `NullPointerException` ajudam a identificar a causa do problema, como:\n        ```java\n        String str = null;\n        // Acessar métodos em str causará NullPointerException com uma mensagem mais descritiva\n        str.length(); // Mensagem: \"Cannot invoke 'length()' because 'str' is null\"\n        ```\n\n## Java 15\n\n- **Data de Lançamento**: Setembro de 2020\n- **Principais Features**:\n    - **Text Blocks**: Torna-se um recurso padrão.\n    - **Sealed Classes**: Permite controlar quais classes podem estender uma classe ou implementar uma interface.\n    - **Hidden Classes**: Suporte para classes ocultas usadas por frameworks e bibliotecas.\n\n## Java 16\n\n- **Data de Lançamento**: Março de 2021\n- **Principais Features**:\n    - **JEP 394: Pattern Matching for instanceof**: Adoção do pattern matching para `instanceof`.\n    - **JEP 395: Records**: Os records tornam-se uma feature padrão.\n    - **JEP 396: ZGC (Z Garbage Collector)**: Introduz o suporte para o ZGC no modo de produção.\n    - **Classes Baseadas em Valor (Preview)**: Introdução de classes baseadas em valor (também conhecidas como \"value classes\") como uma funcionalidade preview, oferecendo uma maneira mais eficiente e semântica para definir classes que representam um conjunto de dados. Essas classes são imutáveis e comparáveis por valor.\n      - **Exemplo**:\n        ```java\n        Integer i = new Integer(5); // deprecated\n        Double d = 2.1;\n        ```\n\n## Java 17\n\n- **Data de Lançamento**: Setembro de 2021\n- **Principais Features**:\n    - **Sealed Classes**:  A funcionalidade que foi introduzida como preview no Java 15 e aprimorada no Java 16, torna-se uma característica padrão no Java 17.\n    - **Pattern Matching for switch (Preview)**: Melhora a sintaxe do switch.\n    - **JEP 389: Foreign Function \u0026 Memory API (Incubator)**: Introduz APIs para interagir com código nativo e memória fora do heap.\n    - **JEP 411: Depreciação da API de `Security Manager`**: Marca a API `Security Manager` como obsoleta e recomenda o uso de alternativas para controle de segurança em Java, refletindo mudanças na abordagem de segurança.\n\n---\n\nPara mais detalhes sobre cada versão e suas mudanças, consulte a [documentação oficial do Java](https://www.java.com/releases/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftibetteixeira%2Flearning-java-features","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftibetteixeira%2Flearning-java-features","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftibetteixeira%2Flearning-java-features/lists"}