避免使用“If(parameter == null)”语句

时间:2016-08-03 15:48:38

标签: java if-statement java-8

这是我的问题。我目前有一个功能正常的路由调用的功能!但是,我想分析检查参数块。

让我解释一下。当用户输入URL以到达该功能时,他可以放置一些可选参数(总共6个)。至少需要其中一个参数才能继续。我的框架配置为为尚未被用户通知的参数分配空值。

要检查已通知哪些参数并验证它们,我有一个块:

public Result edit(String param1, String param2, String param3, String param4, String param5, String param6) {

    Map<String, Object> parameters = new HashMap<>();
    if (param1 != null) {
         // Checking function depending on data type (URL, Boolean, ..), return a clean param or throw an InvalidParamException
         // Variable param depends on type returned by checkParamType1
         param = checkParamType1(param1);
         parameters.put("param1", param);
    }
    if (param2 != null) {
         param = checkParamType1(param2);
         parameters.put("param2", param);
    }
    if (param3 != null) {
         param = checkParamType2(param3);
         parameters.put("param3", param);
    }
    if (param4 != null) {
         param = checkParamType2(param4);
         parameters.put("param4", param);
    }
    if (param5 != null) {
         param = checkParamType3(param5);
         parameters.put("param5", param);
    }
    if (param6 != null) {
         param = checkParamType3(param6);
         parameters.put("param6", param);
    }
    assert(parameters.size() > 0, "At least one parameter required");

    // [TREATMENT]
}

我的问题是,在您看来,是否有可能将此区块分解?

我的项目在JAVA 8上运行。

谢谢:)

5 个答案:

答案 0 :(得分:6)

你能做的最好的事情就是提取一个方法,并为你的自定义检查器使用方法参考。像这样:

private void checkAndAssign(Map<String, Object> map, String paramName, String paramValue, Function<String, Object> checker){
  if(paramValue!=null){
    Object param = checker.apply(paramValue);
    map.put(paramName, param);
  }
}

public Result edit(String param1, String param2, String param3, String param4, String param5, String param6) {

    Map<String, Object> parameters = new HashMap<>();
    checkAndAssign(map, "param1", param1, MyClass::checkParam1);
    checkAndAssign(map, "param2", param2, MyClass::checkParam2);
    checkAndAssign(map, "param3", param3, MyClass::checkParam3);
    checkAndAssign(map, "param4", param4, MyClass::checkParam4);
    checkAndAssign(map, "param5", param5, MyClass::checkParam5);
    checkAndAssign(map, "param6", param6, MyClass::checkParam6);
    assert(parameters.size() > 0, "At least one parameter required");

    // [TREATMENT]
}

MyClass :: checkParam1是方法参考。编译器将允许您将此类引用替换为Function等函数接口。

请参阅Java 8教程中的Method References

答案 1 :(得分:2)

在Java 8中,您可以替换

if (param1 != null) {
     param = checkParamType1(param1);
     parameters.put("param1", param);
}

有类似的东西:

Optional.ofNullable(param1)
    .ifPresent((param) -> parameters.put("param1", checkParamType1(param)));

答案 2 :(得分:0)

首先,您可以使用switch case语句。但在OO语言中,最好使用像责任链这样的设计模式......

答案 3 :(得分:0)

如果参数的数量不受限制,请尝试使用var-args参数并遍历生成的数组。

public Result edit(String... params) {
    Map<String, Object> parameters = new HashMap<>();
    IntStream.range(0, params.length).forEach(idx -> {
        String param = params[idx];
        if (param != null) {
            Object p = checkParamType(param);
            parameters.put("param" + idx, p);
        }
    });
}

答案 4 :(得分:-4)

java 8引入了一项新功能,以避免空值检查。看看:http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/