AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78749107
Accepted
PatPanda
PatPanda
Asked: 2024-07-15 17:30:56 +0800 CST2024-07-15 17:30:56 +0800 CST 2024-07-15 17:30:56 +0800 CST

Problema de refatoração if-else-if string.contains("X") para alternar entre maiúsculas e minúsculas (ou melhor)

  • 772
  • Inclua detalhes sobre seu objetivo:

Gostaria de refatorar if-else-if string.contains("X")instruções em java para mudar de caso ou mapa.

  • Mostre algum código:

Eu tenho um trecho de código, muito simples, que se parece com:

     public String question(String sentence) {
        if (sentence.contains("eat")) {
            return getFoodFromSentence(sentence);
        } else if (sentence.contains("drink")) {
            return getBeverageFromSentence(sentence);
        } else if (sentence.contains("drive")) {
            return getVehicleFromSentence(sentence);
        } else if (sentence.contains("travel")) {
            return getDestinationFromSentence(sentence);
    [...
        many many other else if
    ...]
        } else {
            return "sentence with unknown verb";
        }
    }

    private String getDestinationFromSentence(String sentence) {
        return ""; //some complex code to extract some info from the sentence
    }

    private String getVehicleFromSentence(String sentence) {
        return ""; //some complex code to extract some info from the sentence
    }
[... all the other actual handling methods ]

Desejo refatorar isso usando um switch case:

  • Descreva o que tentei:

Usando caixa de comutação:

   public String question(String sentence) {
        switch (???) { //issue here, I am not able to come up with the expression
            case (sentence.contains("eat")): // issue here, I am not able to have the cases representing the if
                return getFoodFromSentence(sentence);
            case (sentence.contains("drink")):
                return getBeverageFromSentence(sentence);
            case (sentence.contains("drive")):
                return getVehicleFromSentence(sentence);
            case (sentence.contains("travel")):
                return getDestinationFromSentence(sentence);
        [ ... the other case conditions ... ]
            default:
                return "sentence with unknown verb";
        }
    }

Também tentei usar o padrão Map, algo como:

 public String question(String sentence) {
        Map<Predicate<String>, Function<String, String>> map =
                Map.of(s -> s.contains("eat"), s -> getFoodFromSentence(s),
                        s -> s.contains("drink"), s -> getBeverageFromSentence(s),
                        s -> s.contains("drive"), s -> getVehicleFromSentence(s),
                        s -> s.contains("travel"), s -> getDestinationFromSentence(s));
        return map.get(???).apply(sentence); // issue here, how to get the correct key of the map?
    }
  • Pergunta:

Posso perguntar como resolver os problemas de uso do switch case?

Ou talvez como resolver o Mapa?

Existe outra técnica para refatorar isso if-else-if string.contains("X")?

java
  • 3 3 respostas
  • 85 Views

3 respostas

  • Voted
  1. tobias_k
    2024-07-15T22:57:42+08:002024-07-15T22:57:42+08:00

    Para a abordagem baseada em mapa, você poderia tentar isto:

    public String question(String sentence) {
        Map<String, Function<String, String>> map = Map.of(
                "eat", this::getFoodFromSentence,
                "drink", this::getBeverageFromSentence,
                "drive", this::getVehicleFromSentence,
                "travel", this::getDestinationFromSentence
        );
        for (Map.Entry<String, Function<String, String>> entry : map.entrySet()) {
            if (sentence.contains(entry.getKey())) {
                return entry.getValue().apply(sentence);
            }
        }
        return null;
    }
    
    • 2
  2. Best Answer
    VGR
    2024-07-15T23:41:30+08:002024-07-15T23:41:30+08:00

    casedeclarações podem fazer uso da whenpalavra-chave:

    public String question(String sentence) {
        switch (sentence) {
            case String s when sentence.contains("eat"):
                return getFoodFromSentence(sentence);
            case String s when sentence.contains("drink"):
                return getBeverageFromSentence(sentence);
            case String s when sentence.contains("drive"):
                return getVehicleFromSentence(sentence);
            case String s when sentence.contains("travel"):
                return getDestinationFromSentence(sentence);
            default:
                return "sentence with unknown verb";
        }
    }
    
    • 2
  3. Asmir
    2024-07-16T00:48:45+08:002024-07-16T00:48:45+08:00

    Uma solução semelhante com a abordagem de mapa de tobias_k apenas com um LinkedHashMap para garantir a ordem e usando streams e opcionais para possivelmente melhorar um pouco a legibilidade:

    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.function.UnaryOperator;
    
    public class Example {
    
        public static void main(String[] args) {
    
            Example ex = new Example();
    
            String sentence1 = "What do you eat?";
            System.out.println(ex.question(sentence1));
    
            String sentence2 = "What do you drink?";
            System.out.println(ex.question(sentence2));
    
            String sentence3 = "What do you drive?";
            System.out.println(ex.question(sentence3));
    
            String sentence4 = "Where do you travel to?";
            System.out.println(ex.question(sentence4));
    
            String sentence5 = "What did you do yesterday?";
            System.out.println(ex.question(sentence5));
        }
    
        public String question(String sentence) {
    
            Map<String, UnaryOperator<String>> map = new LinkedHashMap<>();
            map.put("eat",    this::getFoodFromSentence);
            map.put("drink",  this::getBeverageFromSentence);
            map.put("drive",  this::getVehicleFromSentence);
            map.put("travel", this::getDestinationFromSentence);
    
            return map.keySet().stream()
                               .filter(sentence::contains)
                               .findFirst()
                               .map(e -> map.get(e).apply(sentence))
                               .orElse("Sentence with unknown verb");
        }
    
        private String getFoodFromSentence(String sentence) {
            return "Haggis";
        }
    
        private String getBeverageFromSentence(String sentence) {
            return "IRN-BRU";
        }
    
        private String getDestinationFromSentence(String sentence) {
            return "Ring of Brodgar";
        }
    
        private String getVehicleFromSentence(String sentence) {
            return "Galloway";
        }
    }
    
    • 1

relate perguntas

  • Lock Condition.notify está lançando java.lang.IllegalMonitorStateException

  • Resposta de microsserviço Muitos para Um não aparece no carteiro

  • Validação personalizada do SpringBoot Bean

  • Os soquetes Java são FIFO?

  • Por que não é possível / desencorajado definir um lado do servidor de tempo limite de solicitação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve