- 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")
?
Para a abordagem baseada em mapa, você poderia tentar isto:
case
declarações podem fazer uso dawhen
palavra-chave: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: