如何传递多个参数和函数,然后在Java 8中使用参数执行函数?

时间:2016-08-05 20:42:20

标签: java function generics lambda java-8

我们有这个学校项目,我们应该在这里租用类似汽车的Java应用程序。

我写了下面的代码,它只需要一些jsonObject属性,根据动作代码调用函数,并将一些东西放在jsonObject属性中。但我真的不喜欢这种代码重复模式...

if(action.equals("REGOPR")) {
    // Register operator
    String user = (String)jsonObject.get("username");
    String pass = (String)jsonObject.get("password");
    if(registerOperator(user, pass))
        jsonObj.put("resp", "Operator successfully registered!");
    else {
        jsonObj.put("status", "fail");
        jsonObj.put("resp", "Username already taken!");
    }
} else if (action.equals("ADDVEH")) {
    // Add vehicle
    String manuf = (String)jsonObject.get("manufacturer");
    String regis = (String)jsonObject.get("registration");
    String licen =((String)jsonObject.get("license"));
    if(addVehicle(manuf, regis, licen))
        jsonObj.put("resp", "Successfully added vehicle!");
    else {
        jsonObj.put("status", "fail");
        jsonObj.put("resp", "Vehicle alredy exists!");
    }
}  And fifteeen more else ifs with different "actions"...

我想做的是这样的事情

if(action.equals("REGOPR")){
     awesomeMethod(registerOperator, 
                  "Custom succesffull message", 
                  "Fail message", 
                  "username", 
                  "password");
} else if(action.equals("ADDVEH")) {
    awesomeMethod(addVehicle, 
                  "Custom succesfull message 2", 
                  "Fail message 2", 
                  "manufacturer", 
                  "registration", 
                  "license");
}

最后任意数量的字符串,每个字符串应该从json中获取值,然后将其输入到给定的函数中。

1 个答案:

答案 0 :(得分:3)

由于方法签名不兼容(不要试图改变这些签名),你必须装入一个数组:

private void awesomeMethod(Predicate<String[]> func, String failMessage,
        String succesMessage, String...arr) {       
    String[] args = new String[arr.length];
    for(int i = 0; i < args.length; i++)
        args[i] = (String) jsonObject.get(arr[i]);

    if(func.test(args)) {
        jsonObj.put("resp", succesMessage);
    } else {
        jsonObj.put("status", "fail");
        jsonObj.put("resp", failMessage);
    }
}

然后,在调用时,您必须将数组位置映射到参数:

awesomeMethod(arr -> addVehicle(arr[0], arr[1], arr[2]), 
              "Custom succesfull message 2", 
              "Fail message 2", 
              "manufacturer", 
              "registration", 
              "license");

如果您只有几个参数数量不同的方法,您还可以考虑为每个参数数量设置重载。这将避免数组装箱,并使调用更简单。

您还可以使用地图删除if语句。