Java 10! O que há de novo?
Java 10
A partir do lançamento oficial do Java 9 a Oracle comunicou que a partir dessa versão as novas versões seriam lançadas a cada 6 meses. E realmente isso aconteceu, muitos de nós nem mesmo conseguimos tempo para estudar a fundo os novos recursos do Java 9 e o Java 10 já foi lançado em 20 de Março de 2018 e trouxe algumas mudanças bem significativas para a linguagem.
Local variable type Inference
Algo bastante interessante na versão 10 do Java foi uma nova forma de se declarar variaveis locais. Como bem sabemos, o Java é uma linguagem de programação fortemente tipada, ou seja, na declaração de qualquer variavel é necessário especificar o tipo dessa variavel. Mas com o Java 10 tivemos uma pequena mudança nesse aspecto.
O novo recurso, nomeado como Local variable type Inference, introduz uma nova forma de se declarar variaveis locais com a chegada do Java 10. Vejamos alguns exemplos:
public void exemplos() {
//Até o Java 9
Integer i = 9;
String s = "Java ";
System.out.println(s + i);
//Java 10
var x = 10;
var y = "Java ";
System.out.println(y + x);
}
Então, percebeu as diferenças entre as 4 declarações de variaveis locais no método exemplos()
? Se sim, você observou que as variaveis x
e y
não tiveram um tipo definido como Integer
ou String
e sim uma nova palavra chave, do Java, que é a var
.
O que acontece agora é que o próprio compilador consegue definir o tipo da variavel a partir do valor de atribuição. Mas, não se esqueça, isso vale apenas para variaveis locais. Você não vai conseguir declarar variaveis de instancia com var
. Por exemplo, o código a baixo não irá compilar:
public class Main {
private var nome = "Marcio";
}
Também não é possível declarar o var
como argumento de métodos. O exemplo a seguir lançaria um erro em tempo de compilação:
public void exemplos(var x1, var x2) {
}
Mas você atribuir o retorno de um método para inicializar uma variavel declarada com var
. Veja no exemplo a seguir que o método getVersao()
retorna um String,
o qual será atribuído a variavel versao
.
public class Main {
public static void main(String[] args) {
Main main = new Main();
var versao = main.getVersao();
System.out.println(versao);
}
public String getVersao() {
return "Java 10";
}
}
Outra caracteristica desse novo recurso é que ele só trabalha com declaração direta, caso contrário o código não vai compilar. Observe o exemplo a seguir e perceba que é possível declarar uma variavel String
de forma indireta, já a declaração indireta com var
não é possível, novamente teríamos um erro em tempo de compilação.
public void exemplo() {
// compila
String nome;
nome = "Java";
// não compila
var idade;
idade = 10;
}
Você também pode usar a declaração var
para tipos complexos de objetos e não apenas para String
, Integer
, Long
, etc. Confira alguns exemplos a seguir:
public void exemplos() {
//atribui um ArrayList de String's
var nomes = Arrays.asList("Ana", "Bia", "Lú");
//atribui uma lista de Pessoa's
var pessoas = dao.findByPessoas();
//atribui um objeto Usuario
var joao = new Usuario("Joao Luis", 25, 'M');
}
Immutable Collections
Outro recurso interessante lançado no Java 10 é uma nova API para criação de coleções imutaveis. Coleções imutaveis são aquelas criadas e não modificaveis. Um exemplo bastante comum que tinhamos até o Java 9 é o Arrays.asList()
, uma forma mais direta de se criar uma lista. Entretanto, após criar uma lista desse tipo, não será possível incluir mais novos valores
a lista. Por isso ela é considerada imutável.
Com o Java 10 as coleções como java.util.Set
e java.util.Map
também passaram a ter métodos para criação direta e imutavel. Eu particularmente, sentia falta disso em relação ao java.util.Map
e gostei bastante desse novo recurso. Veja agora do que se trata:
public void coll() {
List<String> strings = new ArrayList<>();
strings.add("Ana Lucia");
strings.add("Joana");
strings.add("Pricila");
strings.add("Bianca");
var s = Set.copyOf(strings);
s.forEach(System.out::println);
var n = Set.of("Bia", "Ana", "Lú", "Jô");
n.forEach(System.out::println);
var m = Map.of("K1", 1, "K2", 2, "K3", 3);
m.forEach((k,v) -> System.out.println("Key="+k + " " + "Value="+v));
}
Tanto a interface Set
quanto a Map
tem agora o método estático copyOf()
que recebe como parâmetro uma coleção já existente. Como pode ser visto na declaração da variavel copia
. Além disso, essas interfaces possuêm uma lista de método nomeados como of()
.
Os métodos of()
recebem declarações diretas dos valores que se deseja incluir na coleção. Como vemos em set
e map
. O of()
de Map
é o caso mais interessante, já que um Map
possui uma chave e um valor. Sendo assim, ao usar o método of()
o primeiro parâmetro é chave e o segundo o valor. Caso queira incluir mais valores, o terceiro parâmetro será uma nova chave e o quarto parâmetro o valor desta chave e assim por diante.
E agora, vai passar a utilizar esse novo modelo de declaração de variaveis locais? Se sim, lembre-se que este recurso estará disponível apenas se você já instalou o JDK 10.