【问题标题】:How to pass multiple parameters and a function and then execute function with parameters in Java 8?如何在 Java 8 中传递多个参数和一个函数,然后执行带参数的函数?
【发布时间】:2016-08-05 20:42:19
【问题描述】:

我们有这个学校项目,我们应该在其中制作类似租车的 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 中获取值并将其输入给定的函数。

【问题讨论】:

  • 我认为你可以在awesomeMethod(String... obj) 上使用这个,这基本上告诉awesomeMethod() 他将收到一个或多个参数。使用Object... obj 时,应始终将其放在最后。例如:method(String one, String two, String... three).
  • @Julian 是的。但这只会传递参数的名称。以后如何使用新提取的参数调用函数?
  • 您是否考虑过更多态的方法?也许使用接口的 HashMap 而不是 15+ 的 switch 语句?
  • @Johannes 你能再扩展一下吗?这些天我对 Java 有点生疏了。 :D

标签: java function generics lambda java-8


【解决方案1】:

由于方法签名不兼容(我们不要尝试更改它们),您必须将其装入数组:

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 语句。

【讨论】:

  • 这假定jsonObjectjsonObj 不是局部变量。
  • @shmosel 是的,就像 OP 在使用 awesomeMethod 的示例中所做的那样
  • 他可以简单地将它们添加到那个 awesomeMethod 的参数中,答案仍然有效
  • @JornVernee OP 的示例显然是假设性的。它不一定反映什么是可能的。
  • @Johannes,同意了。虽然它不再那么棒了。实际上,我写的是完全相同的答案,但差别很小,但这样就可以了。
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 2014-01-06
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多