Lógica e Algoritmos com Java

18 - Expressões Switch

As switch expressions foram introduzidas no Java 12, trazendo uma forma mais moderna e flexível de escrever estruturas switch. Elas permitem que você use o switch não apenas para executar blocos de código com base em um valor, mas também para retornar um valor diretamente de uma expressão, tornando o código mais compacto e legível.

1. Sintaxe de Switch Expressions

A sintaxe das expressões switch é diferente da estrutura tradicional. A principal diferença é que as expressões switch podem retornar um valor, e não precisam usar a palavra-chave break.

        
variável = switch (expressão) {
    case valor1 -> valor_retornado1;
    case valor2 -> valor_retornado2;
    case valor3 -> valor_retornado3;
    default -> valor_default;
};
        
    

Note que: - A palavra-chave -> substitui o uso de : no `case`. - O default pode ser usado, mas não é obrigatório. Caso não seja fornecido, uma exceção será lançada se o valor não corresponder a nenhum dos casos.

2. Exemplo Básico de Switch Expression

Vamos usar uma expressão switch para determinar o nome de um dia da semana baseado em um número.

        
public class ExemploSwitchExpression {
    public static void main(String[] args) {
        int dia = 3;
        
        String nomeDia = switch (dia) {
            case 1 -> "Domingo";
            case 2 -> "Segunda-feira";
            case 3 -> "Terça-feira";
            case 4 -> "Quarta-feira";
            case 5 -> "Quinta-feira";
            case 6 -> "Sexta-feira";
            case 7 -> "Sábado";
            default -> "Dia inválido";
        };
        
        System.out.println(nomeDia);
    }
}
        
    

Saída: Terça-feira

3. Exemplo de Switch Expression com Variáveis de Controle

Você também pode usar expressões switch para realizar múltiplos cálculos ou ações e retornar um valor baseado na expressão.

        
public class ExemploSwitchComCalculadora {
    public static void main(String[] args) {
        int a = 10, b = 5;
        String operacao = "soma";  // Tente mudar para "subtracao", "multiplicacao" ou "divisao"
        
        int resultado = switch (operacao) {
            case "soma" -> a + b;
            case "subtracao" -> a - b;
            case "multiplicacao" -> a * b;
            case "divisao" -> a / b;
            default -> 0;
        };
        
        System.out.println("Resultado: " + resultado);
    }
}
        
    

Saída: Resultado: 15

4. Exemplo de Switch Expression com Bloco de Código

Em alguns casos, você pode querer realizar múltiplas instruções para um caso específico. Isso é possível com a sintaxe de expressão switch, que suporta blocos de código dentro de cada case.

        
public class ExemploSwitchComBloco {
    public static void main(String[] args) {
        int dia = 3;
        
        String nomeDia = switch (dia) {
            case 1 -> {
                String diaNome = "Domingo";
                yield diaNome;  // 'yield' retorna o valor do bloco
            }
            case 2 -> "Segunda-feira";
            case 3 -> "Terça-feira";
            case 4 -> "Quarta-feira";
            case 5 -> "Quinta-feira";
            case 6 -> "Sexta-feira";
            case 7 -> "Sábado";
            default -> "Dia inválido";
        };
        
        System.out.println(nomeDia);
    }
}
        
    

Saída: Terça-feira

5. Tabela de Sintaxe e Exemplos de Switch Expressions

Componente Descrição Exemplo
switch A palavra-chave que inicia a estrutura de escolha. switch (variável) { ... }
case Usada para especificar os valores a serem comparados com a variável. case valor -> valor_retornado;
-> Substitui o uso de ":", sendo usado para associar um valor a um case. case valor -> valor_retornado;
yield Usado para retornar o valor de um bloco de código dentro do switch. yield valor;
default Executado se nenhum dos cases corresponder ao valor da variável. default -> valor_default;

6. Conclusão

As switch expressions trazem uma nova abordagem mais moderna e poderosa para as estruturas de escolha em Java. Elas tornam o código mais conciso e, ao mesmo tempo, permitem maior flexibilidade, como o uso de blocos de código e retorno de valores diretamente de cada caso. Além disso, o uso de `yield` facilita o retorno de valores dentro de blocos de código, permitindo que o switch seja usado de forma mais dinâmica e funcional.