💻 Exemplos: Capítulo 02: Estrutura Condicional (if-else, switch expressions) e Operador Ternário
Especialização em Sistemas com Java 21 LTS • Capítulo 02
🎯 Visão Geral dos Exemplos Práticos
Neste laboratório prático, implementaremos exemplos corporativos completos explorando:
- Motor de Regras Tributárias com Switch Expressions e Yield: desvios baseados em enums e alíquotas com blocos de instrução multi-linha.
- Validador de Transações com Pattern Matching e Guardas (
when): inspeção polimórfica de payloads heterogêneos sem casts manuais. - Cálculo Seguro com Operador Ternário e Evitação de NPE: controle rígido de tipos para prevenir erros de unboxing.
💻 Exemplo 01 — Motor de Tarifação Fiscal com Switch Expressions e yield
package com.empresa.condicionais;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* Calculadora de impostos e tarifas operacionais utilizando Switch Expressions modernas.
*/
public class MotorTarifarioFiscal {
public enum RegimeTributario {
SIMPLES_NACIONAL, LUCRO_PRESUMIDO, LUCRO_REAL, MEI
}
public enum TipoOperacao {
VENDA_MERCADORIA, PRESTACAO_SERVICO, LOCACAO_BENS
}
public static BigDecimal calcularTributo(
RegimeTributario regime,
TipoOperacao operacao,
BigDecimal faturamento) {
if (faturamento == null || faturamento.compareTo(BigDecimal.ZERO) <= 0) {
return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_EVEN);
}
// Switch expression com branches escalares e blocos com yield
BigDecimal aliquotaEfetiva = switch (regime) {
case MEI -> BigDecimal.ZERO; // Isento na nota individual
case SIMPLES_NACIONAL -> switch (operacao) {
case VENDA_MERCADORIA -> new BigDecimal("0.045"); // 4.5%
case PRESTACAO_SERVICO -> new BigDecimal("0.060"); // 6.0%
case LOCACAO_BENS -> new BigDecimal("0.035"); // 3.5%
};
case LUCRO_PRESUMIDO -> {
BigDecimal aliquotaBase = (operacao == TipoOperacao.PRESTACAO_SERVICO)
? new BigDecimal("0.1633") // PIS/COFINS/ISS/IR/CSLL
: new BigDecimal("0.1133");
System.out.printf(" [AUDITORIA] Aplicando regime Lucro Presumido para %s: %.4f%%%n",
operacao, aliquotaBase.multiply(new BigDecimal("100")));
yield aliquotaBase;
}
case LUCRO_REAL -> {
// Lucro Real aplica alíquota cheia com deduções apuradas
BigDecimal baseCheia = new BigDecimal("0.2425");
yield baseCheia;
}
};
return faturamento.multiply(aliquotaEfetiva).setScale(2, RoundingMode.HALF_EVEN);
}
public static void main(String[] args) {
System.out.println("================================================================================");
System.out.println(" SIMULADOR FISCAL COM JAVA 21 SWITCH EXPRESSIONS ");
System.out.println("================================================================================");
BigDecimal faturamento1 = new BigDecimal("45000.00");
BigDecimal tributo1 = calcularTributo(RegimeTributario.SIMPLES_NACIONAL, TipoOperacao.PRESTACAO_SERVICO, faturamento1);
System.out.printf("Simples Nacional (Serviço) - Fat: R$ %10.2f | Imposto: R$ %8.2f%n", faturamento1, tributo1);
BigDecimal faturamento2 = new BigDecimal("120000.00");
BigDecimal tributo2 = calcularTributo(RegimeTributario.LUCRO_PRESUMIDO, TipoOperacao.VENDA_MERCADORIA, faturamento2);
System.out.printf("Lucro Presumido (Venda) - Fat: R$ %10.2f | Imposto: R$ %8.2f%n", faturamento2, tributo2);
BigDecimal tributoMei = calcularTributo(RegimeTributario.MEI, TipoOperacao.PRESTACAO_SERVICO, new BigDecimal("5000.00"));
System.out.printf("MEI (Prestação de Serviço) - Fat: R$ 5000.00 | Imposto: R$ %8.2f%n", tributoMei);
System.out.println("================================================================================");
}
}
💻 Exemplo 02 — Análise Antifraude com Pattern Matching e Cláusula when
package com.empresa.condicionais;
import java.math.BigDecimal;
import java.time.LocalTime;
/**
* Validador antifraude de transações financeiras utilizando Pattern Matching Java 21 LTS.
*/
public class AnaliseTransacaoAntifraude {
public sealed interface Transacao permits Pix, CartaoCredito, Ted, BoletoBancario {}
public record Pix(String chaveDestino, BigDecimal valor, LocalTime horario, boolean contatoSalvo) implements Transacao {}
public record CartaoCredito(String cartaoMascarado, BigDecimal valor, int tentativasSenha, boolean cvvCorreto) implements Transacao {}
public record Ted(String bancoDestino, BigDecimal valor, boolean contaMesmaTitularidade) implements Transacao {}
public record BoletoBancario(String linhaDigitavel, BigDecimal valor, boolean vencido) implements Transacao {}
public enum StatusTransacao {
APROVADA, SUSPEITA_BLOQUEADA, REPROVADA_SEGURANCA
}
public static StatusTransacao inspecionarRisco(Transacao transacao) {
return switch (transacao) {
case null -> StatusTransacao.REPROVADA_SEGURANCA;
// PIX Noturno acima de R$ 1.000 para destinatário desconhecido
case Pix p when (p.horario().isAfter(LocalTime.of(20, 0)) || p.horario().isBefore(LocalTime.of(6, 0)))
&& p.valor().compareTo(new BigDecimal("1000.00")) > 0
&& !p.contatoSalvo() -> {
System.out.printf("⚠️ [ALERTA FRAUDE] PIX Noturno de R$ %.2f para chave não salva: %s%n", p.valor(), p.chaveDestino());
yield StatusTransacao.SUSPEITA_BLOQUEADA;
}
case Pix p -> StatusTransacao.APROVADA;
// Cartão de Crédito com violação de tentativas de senha
case CartaoCredito c when !c.cvvCorreto() || c.tentativasSenha() >= 3 -> {
System.out.printf("🚨 [SEGURANÇA] Bloqueio por senha incorreta (%d tentativas) no cartão %s%n",
c.tentativasSenha(), c.cartaoMascarado());
yield StatusTransacao.REPROVADA_SEGURANCA;
}
case CartaoCredito c when c.valor().compareTo(new BigDecimal("10000.00")) > 0 -> StatusTransacao.SUSPEITA_BLOQUEADA;
case CartaoCredito c -> StatusTransacao.APROVADA;
// TED de alta soma para conta de outra titularidade
case Ted t when !t.contaMesmaTitularidade() && t.valor().compareTo(new BigDecimal("50000.00")) > 0 ->
StatusTransacao.SUSPEITA_BLOQUEADA;
case Ted t -> StatusTransacao.APROVADA;
// Boleto vencido não pode ser liquidado em tempo real
case BoletoBancario b when b.vencido() -> StatusTransacao.REPROVADA_SEGURANCA;
case BoletoBancario b -> StatusTransacao.APROVADA;
};
}
public static void main(String[] args) {
System.out.println("================================================================================");
System.out.println(" GATEWAY DE TRANSAÇÕES FINANCEIRAS: AUDITORIA ");
System.out.println("================================================================================");
Transacao tx1 = new Pix("financeiro@fornecedor.com", new BigDecimal("3500.00"), LocalTime.of(22, 15), false);
Transacao tx2 = new CartaoCredito("****-****-****-9821", new BigDecimal("120.00"), 1, true);
Transacao tx3 = new CartaoCredito("****-****-****-1100", new BigDecimal("500.00"), 3, false);
Transacao tx4 = new BoletoBancario("34191.79001 01043.510047 91020.150008 5 95600000010000", new BigDecimal("100.00"), true);
System.out.printf("Status Tx1 (PIX Noturno Suspeito) : [%s]%n", inspecionarRisco(tx1));
System.out.printf("Status Tx2 (Cartão Legítimo) : [%s]%n", inspecionarRisco(tx2));
System.out.printf("Status Tx3 (Cartão Ataque Senha) : [%s]%n", inspecionarRisco(tx3));
System.out.printf("Status Tx4 (Boleto Vencido) : [%s]%n", inspecionarRisco(tx4));
System.out.println("================================================================================");
}
}
📋 Resultado Esperado no Console
================================================================================
SIMULADOR FISCAL COM JAVA 21 SWITCH EXPRESSIONS
================================================================================
Simples Nacional (Serviço) - Fat: R$ 45000.00 | Imposto: R$ 2700.00
[AUDITORIA] Aplicando regime Lucro Presumido para VENDA_MERCADORIA: 11.3300%
Lucro Presumido (Venda) - Fat: R$ 120000.00 | Imposto: R$ 13596.00
MEI (Prestação de Serviço) - Fat: R$ 5000.00 | Imposto: R$ 0.00
================================================================================
================================================================================
GATEWAY DE TRANSAÇÕES FINANCEIRAS: AUDITORIA
================================================================================
⚠️ [ALERTA FRAUDE] PIX Noturno de R$ 3500.00 para chave não salva: financeiro@fornecedor.com
Status Tx1 (PIX Noturno Suspeito) : [SUSPEITA_BLOQUEADA]
Status Tx2 (Cartão Legítimo) : [APROVADA]
🚨 [SEGURANÇA] Bloqueio por senha incorreta (3 tentativas) no cartão ****-****-****-1100
Status Tx3 (Cartão Ataque Senha) : [REPROVADA_SEGURANCA]
Status Tx4 (Boleto Vencido) : [REPROVADA_SEGURANCA]
================================================================================