我需要简化以下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))
答案 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.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,
由于NOT(!)运算符,基本上将所有运算都取反。由于只剩下&&运算符即可组合布尔子表达式,因此可以删除括号。
if (PLANNED != s
&& MISSED != s
&& SKIPPED != s
&& SELF_ADMINISTERED != s
&& SELF_ADMINISTERED_BY_RANGE != s
&& isSpecialDoseType(doseDetail)
)
现在,如果您具有良好的领域知识,就可以知道是否可以结合自己 被管理到一个变量中,然后被运送/遗失到另一个变量中,使其具有类似以下内容:(计划的或已停止的,遗失的或自我管理的)都不是特殊的。但是,如果没有这样的知识,我会在这个级别上实现这种表达。