Idéias para substituir fluxo condicionais(if/else)

5 respostas Resolvido
java
R

Eae galera, seguinte, tenho um código abaixo e queria sugestões de idéias para mim poder substituir esse monte de "IF/ELSE" no meu código !

[code]
public class MenuFactory {

public static void getMenu(String opcao) {
int cadastrando = 1;

while (cadastrando == 1) {
String selecioneOpcao = textInput(
"SELECIONE A OPÇÃO: 1 - PEDIDO \n 2 - CADASTRAR CLIENTE \n 3 - CADASTRAR VEÍCULO "
+ "\n 4 - ATUALIZAR \n 5 - CONSULTAR ");

if (selecioneOpcao.equalsIgnoreCase("1")) {
MenuPedido.pedido(textInput("DATA DE ENTREGA: "), textInput("DATA DE RETIRADA: "));
} else if (selecioneOpcao.equalsIgnoreCase("2")) {
MenuCadastraCliente.cadastroCliente();
} else if (selecioneOpcao.equalsIgnoreCase("3")) {
MenuCadastraVeiculo.cadastroVeiculo();
} else if (selecioneOpcao.equals("4")) {
MenuAtualizar.atualizar();
} else if (selecioneOpcao.equalsIgnoreCase("5")) {
MenuConsultar.consultar();
} else {
System.out.println("OPÇÃO INVÁLIDA ! Noob xD");
}

// CONTINUAR NO MENU
String continuarNoMenu = textInput("CONTINUAR NO MENU ? SIM [1] / NÃO [2]");
if (continuarNoMenu.equalsIgnoreCase("1")) {

} else if (continuarNoMenu.equalsIgnoreCase("2")) {
cadastrando = 2;
}
}
}

// MÉTODO IMPLEMENTAÇÃO DE TEXTO
private static String textInput(String string) {
System.out.println(
Scanner input = new Scanner(System.in);
return input.nextLine();
}

5 Respostas

S
Solucao aceita

Você pode implementar um mapa de ações por exemplo:

import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public final class MenuFactory {

    private static MenuFactory instance;

    /**
     * Obtém a única instância desta classe
     */
    public static synchronized MenuFactory get() {
        if (instance == null) {
            instance = new MenuFactory();
        }
        return instance;
    }

    private final Scanner input = new Scanner(System.in);
    private final PrintStream output = System.out;

    /**
     * Um mapa de ações a serem executadas
     */
    private final Map<String, Runnable> acoes;

    private MenuFactory() {
        // Registrar as ações válidas
        acoes = new HashMap<>();
        acoes.put("1", () -> MenuPedido.pedido(textInput("DATA DE ENTREGA: "), textInput("DATA DE RETIRADA: ")));
        acoes.put("2", () -> MenuCadastraCliente.cadastroCliente());
        acoes.put("3", () -> MenuCadastraVeiculo.cadastroVeiculo());
        acoes.put("4", () -> MenuAtualizar.atualizar());
        acoes.put("5", () -> MenuConsultar.consultar());
    }

    public void getMenu() {
        int cadastrando = 1;
        while (cadastrando == 1) {
            String opcao = textInput("SELECIONE A OPÇÃO:\n"
                    + " 1 - PEDIDO \n"
                    + " 2 - CADASTRAR CLIENTE \n"
                    + " 3 - CADASTRAR VEÍCULO \n"
                    + " 4 - ATUALIZAR \n"
                    + " 5 - CONSULTAR ");

            /*
             * Obter uma ação a partir do mapa
             */    
            Runnable acao = acoes.get(opcao);
            if (acao != null) { // ação existe?
                acao.run(); // sim, então executa ela
            } else {
                output.println("OPÇÃO INVÁLIDA ! Noob xD"); // não, então apresenta mensagem
            }
            // CONTINUAR NO MENU
            cadastrando = intInput("CONTINUAR NO MENU ? SIM [1] / NÃO [2]");
        }
    }

    /**
     * Entrada de dados na forma de <tt>int</tt>
     */
    private int intInput(String string) {
        return Integer.parseInt(textInput(string));
    }

    /**
     * Entrada de dados na forma de <tt>String</tt>
     */
    private String textInput(String string) {
        output.println(string);
        return input.nextLine();
    }
}
R

Valeu amigo consegui encaixar no meu codigo !

R

amigo perguntar, o que significa esse Value que vc faz no Map “() ->” ele esta querendo indicar oq ?

S

Isso é uma expressão lambda.
Como a interface Runnable só possui um método, pode-se fazer uma expressão lambda ao invés de usar uma classe anônima.

Os parênteses são vazios pois o método run não possui parâmetros.

A expressão abaixo:

acoes.put("4", () -> MenuAtualizar.atualizar());

Equivale a fazer isso aqui:

acoes.put("4", new Runnable() {

    public void run() {
        MenuAtualizar.atualizar();
    }
});
R

Ah tá, compreendi ! Muito bom, valeu !!

Criado 8 de novembro de 2019
Ultima resposta 12 de nov. de 2019
Respostas 5
Participantes 2