[Java 21+] O discard de variáveis em Java é feito utilizando o identificador
(_) também encontrado em algumas outras linguagens como Go, C# e Rust, por
exemplo.
Com esse identificador podemos informar explicitamente parâmetros de
expressões lambda, exceptions no bloco catch, destructuring(desmontar) do
tipo record e outras situações
semelhantes que não precisamos utilizar um valor recuperado.
No próximo exemplo, vamos ignorar o objeto
exception lançado em um bloco
try. No bloco catch, utilizamos o identificador (_) no lugar do argumento:
Exemplo 16
//Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main
{
public static void main(String[] args) {
try
{
String arq = "arquivo nao existe";
Files.readString(Path.of(arq)); //erro gerado
}
catch (IOException _) //exception ignorada
{
System.out.println("Erro");
}
}
}
Saída
Erro
No exemplo abaixo, vamos desmontar os campos de uma tipo de dado record e
ignorar um dos campos:
Exemplo 17
//Main.java
public class Main
{
public record MeuRecord(int campo1, String campo2, float campo3) {}
public static void main(String[] args) {
MeuRecord obj = new MeuRecord(1, "teste", 9.12f);
if (obj instanceof MeuRecord(int a, String b, float _)) //y ignorado
{
System.out.println("a: " + a);
System.out.println("b: " + b);
}
}
}
Saída
a:1
b:teste
No comando switch pattern ou match, podemos podemos também ignorar valores
de forma semelhante ao que foi mostrado no exemplo acima:
Exemplo 18
//Main.java
public class Main
{
public record MeuRecord(int campo1, String campo2, float campo3) {}
public static void main(String[] args) {
MeuRecord obj = new MeuRecord(2, "teste2", 9.12f);
switch (obj)
{
//ignorando campo1 e campo3
case MeuRecord(int _, String campo2, float _) ->
System.out.println("campo2:" + campo2);
default -> System.out.println("erro");
}
}
}
Saída
campo2:teste2