在Java 8中,有没有更好的方法来检查这种情况?

时间:2019-05-28 01:40:29

标签: java collections java-8

我需要简化以下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 个答案:

答案 0 :(得分:3)

使用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 :(得分:1)

目前尚不清楚我们在处理什么数据类型,因此,在您能对此有所了解之前,我无法给您一个更好的答案。但是假设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无关。如果您可以提供有关什么的更多信息,我可以为您提供进一步的帮助。

答案 2 :(得分:1)

提供的get方法没有副作用,并且始终返回相同的值(在示例范围内), 您可以使用重构 提取变量

s = dispensingOccasionModel.getOc​​casionDTO()。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, 

由于NOT(!)运算符,基本上将所有运算都取反。由于只剩下&&运算符即可组合布尔子表达式,因此可以删除括号。

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

现在,如果您具有良好的领域知识,就可以知道是否可以结合自己 被管理到一个变量中,然后被运送/遗失到另一个变量中,使其具有类似以下内容:(计划的或已停止的,遗失的或自我管理的)都不是特殊的。但是,如果没有这样的知识,我会在这个级别上实现这种表达。