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

Twi*_*sky 3 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]
}
Run Code Online (Sandbox Code Playgroud)

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

我的项目在JAVA 8上运行.

谢谢 :)

Sea*_*oyd 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]
}
Run Code Online (Sandbox Code Playgroud)

MyClass :: checkParam1是方法引用.编译器将允许您将此类引用替换为类似的功能接口Function.

请参阅Java 8教程中的方法参考.

  • 我知道`checkParamType`方法特定于每个参数.因此,您不能对所有参数使用`checkParamType1` (2认同)
  • 好的,我会在下次更新中解决这个问题 (2认同)
  • @Twisky不,你应该创建自己的功能界面,它具有你需要的完全签名 (2认同)