Как я могу оптимизировать следующее, если еще? - PullRequest
1 голос
/ 22 сентября 2019

У меня есть следующий блок if else.

if (result.first && result.last) {
    output= "both present"
} else if (!result.first && result.last) {
    output= "last present"
} else if (result.first && !result.last) {
    output= "first present"
} else {
    output = "none present"
}

Код выглядит неуклюжим.Есть ли способ, которым я могу оптимизировать это.

Ответы [ 5 ]

3 голосов
/ 22 сентября 2019

Просто причудливый способ - использовать троичный оператор.Это ничем не отличается от использования каскада if, но представляет собой одиночное присваивание (удобно, если output равно final, хотя в этом случае не является строго обязательным).

output = 
  result.first 
    ? (result.last ? "both present" : "first present")
    : (result.last ? "last present" : "none present");

Поскольку существует 4 возможных результата, невозможно уменьшить его ниже log_2(4) == 2 вложенных условий.

Вы также можете использовать предопределенную карту поиска.

1 голос
/ 22 сентября 2019

Вместо проверки обоих в одном условии, используйте вложенные операторы if:

if (result.first) {
    if (result.last) {
        output = "both present";
    } else {
        output = "first present";
    }
} else {
    if (result.last) {
        output = "last present";
    } else {
        output = "none present";
    }
}

Это легко приводит к использованию троичного условного оператора:

if (result.first) {
    output = (result.last ? "both present" : "first present");
} else {
    output = (result.last ? "last present" : "none present");
}

Который также может быть вложенным:

output = (result.first ? (result.last ? "both present" : "first present")
                       : (result.last ? "last present" : "none present"));

Если нужно проверить много логических значений, глубокое вложение может стать громоздким, поэтому вы можете использовать битовую маскировку:

private static final String[] OUTPUTS = { "none present", "first present",
                                          "last present", "both present" };
output = OUTPUTS[(result.first ? 1 : 0) + (result.last ? 2 : 0)];
1 голос
/ 22 сентября 2019
if (result.first && result.last){
   output= "both present"
} else if (result.last) {
   output= "last present"
} else if (result.first) {
   output= "first present"
} else {
   output = "none present"
}

Кроме того, если вы можете, вы можете поместить логику в «результат», тогда вам не нужно «получать» вещи, которые принадлежат результату.Вы даже можете заменить if / else полиморфизмом, если продвинете логику достаточно далеко.

0 голосов
/ 22 сентября 2019

Это мой подход к таким утверждениям, давайте предположим, что result является объектом и имеет два примитивных логических элемента (имейте в виду, что в «большом» логическом значении может быть ноль) first и last ( с методами получения )

public class Result {

  private boolean first;
  private boolean last;

//getters, constructor etc

}

Давайте обернем условия в Predicate и поместим их в карту, где ключ - это предикат, а значение - ожидаемое значение:

private final static Predicate<Result> = RESULT_1-> result.getFirst() && result.getLast();
private final static Predicate<Result> = RESULT_2 -> !result.getFirst() && result.getLast();
private final static Predicate<Result> = RESULT_3 -> result.getFirst() && !result.getLast();

private final static DEFAULT_VALUE = "none present";

private final static Map<Predicate<Result>, String> RESULT_MAP = Map.of(
RESULT_1, "both present",
RESULT_2, "last present",
RESULT_3, "first presnt");

Затем вы можете использовать его следующим образом:

String output = map.entrySet().stream().filter(predicate -> predicate.getKey().test(resultToTest))
        .findFirst()
        .map(Entry::getValue).orElse(DEFAULT_VALUE);

Конечно, дайте этим переменным осмысленные имена, сделайте некоторую экстракцию и т. Д. В этом подходе, когда вам нужно добавить новое условие в код, вы просто добавляетеновый предикат на карту, и все.В случае, если вы маленький, вам не нужно писать гибкий код, как я показал, но в более сложных вопросах этот подход приемлем.

0 голосов
/ 22 сентября 2019
output = "none present"
if (result.first){
   output= "first present"
   if(result.last){
      output= "both present"
    }
} else if (result.last) {
output= "last present"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...