Есть ли лучшие способы проверить это условие в Java 8? - PullRequest
2 голосов
/ 28 мая 2019

Мне нужно упростить следующий код в Java.Есть ли способ использовать set и сделать это?

      if (!(((AdministrativeState.PLANNED == dispensingOccasionModel.getOccasionDTO().getAdminState()) ||
             (AdministrativeState.MISSED == dispensingOccasionModel.getOccasionDTO().getAdminState()) ||
             (AdministrativeState.SKIPPED == dispensingOccasionModel.getOccasionDTO().getAdminState()) ||
             (AdministrativeState.SELF_ADMINISTERED == dispensingOccasionModel.getOccasionDTO().getAdminState()) ||
(AdministrativeState.SELF_ADMINISTERED_BY_RANGE == dispensingOccasionModel.getOccasionDTO().getAdminState())) &&
        isSpecialDoseType(doseDetail))

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

Используя Set, вы можете инициализировать допустимые типы перечислений и выполнить содержимое, как @shmosel также указал в комментариях:

Set<AdministrativeState> administrativeStates = Set.of(PLANNED, MISSED, SKIPPED, SELF_ADMINISTERED, SELF_ADMINISTERED_BY_RANGE)
if (!administrativeStates.contains(dispensingOccasionModel.getOccasionDTO().getAdminState())
        || !isSpecialDoseType(doseDetail))
1 голос
/ 28 мая 2019

При условии, что методы get не имеют побочных эффектов и возвращают всегда одно и то же значение (в рамках вашего примера), вы можете использовать рефакторинг Извлечь переменную

s = dispensingOccasionModel.getOccasionDTO () .getAdminState ());

Кроме того, вы можете статически импортировать AdministrativeState. *.

Затем вы получите:

 AdministrativeState s =dispensingOccasionModel.getOccasionDTO().getAdminState();

 if (!(((PLANNED == s) || (MISSED == s ) || (SKIPPED == s) || 
(SELF_ADMINISTERED == s) || 
(SELF_ADMINISTERED_BY_RANGE == s))
 && isSpecialDoseType(doseDetail))

Затем с учетом того, что двойной каналОператор (логическое ИЛИ) имеет довольно высокий приоритет, поэтому вы можете убрать круглые скобки вокруг отдельных сравнений:

 (a==b)||(c==d) ===> a==b||c==d. 

Вы получите:

if (!((PLANNED == s ||
MISSED == s  || 
SKIPPED == s || 
SELF_ADMINISTERED == s || 
SELF_ADMINISTERED_BY_RANGE == s)) 
&& isSpecialDoseType(doseDetail))

После двойных скобок!И до &&.Их можно уменьшить до одного.

  if (!(PLANNED == s ||
 MISSED == s 
 || SKIPPED == s || 
 SELF_ADMINISTERED == s || 
 SELF_ADMINISTERED_BY_RANGE == s)
  && isSpecialDoseType(doseDetail))

Теперь вы можете использовать правило инвертирования логических выражений:

  !(a==b|| c==d) ===> a!=b&&c!=d, 

, которое в основном инвертирует все операции из-за НЕ (!) Оператор.Поскольку у вас останутся только операторы && для объединения логических подвыражений, вы можете убрать круглые скобки.

if (PLANNED != s 
&& MISSED != s
&& SKIPPED != s
&& SELF_ADMINISTERED != s
&& SELF_ADMINISTERED_BY_RANGE != s
&& isSpecialDoseType(doseDetail)
)

Теперь, если у вас есть хорошие знания предметной области, вы можете знать, можете ли вы объединить self Administered в одну переменную иотправлены / пропущены в другой, чтобы иметь что-то вроде: ни (запланировано, ни остановлено, ни зарегистрировано самостоятельно) && isSpecial.Но без такого знания я бы жил выражением на этом уровне.

1 голос
/ 28 мая 2019

Неясно, с какими типами данных мы имеем здесь дело, поэтому я не могу дать вам лучший ответ, пока вы не сможете пролить больше света на это. Но предполагая, что AdministrativeState является перечислителем, вы можете сделать что-то вроде этого:

public enum AdministrativeState {

    NONE, PLANNED, MISSED, SKIPPED, SELF_ADMINISTERED,
    SELF_ADMINISTERED_BY_RANGE;
}

public static class OccasionModel {

    AdministrativeState state;

    OccasionModel() {
        this.state = AdministrativeState.NONE;
    }

    OccasionModel setState(AdministrativeState state) {
        this.state = state;
    }
}

public static void checkAdminState(OccasionModel model) {

    OccasionModel dispensingOccasionModel = model;

    if (dispensingOccasionModel.state != AdministrativeState.NONE) {
        // Do something here...
    }
    else System.out.println("Administrative state is not set yet");
}

public static void main(String[] args) throws IOException {

    checkAdminState(new OccasionModel());
    checkAdminState(new OccasionModel().setState(AdministrativeState.PLANNED));
}

Я не уверен, что это то, что вы ищете, но это не имеет ничего общего с Java 8, в частности. Если вы можете предоставить больше информации о том, чем я могу вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...