【问题标题】:How to convert Strings in functions in Java? [duplicate]如何在Java中的函数中转换字符串? [复制]
【发布时间】:2015-02-13 11:37:58
【问题描述】:

我正在尝试在 Java 中创建一个将 String 和 double 作为参数的函数,如下所示:

public static double calc(String fx, double arg) {
    return fx.convertToFunction(arg);   // Pseudocode

}

例如,要计算一个数字(例如 PI)的余弦,代码如下:

calc("cos", Math.PI);

函数 calc 必须将 "cos" 转换为 Math.cos()。

至少有可能吗?

【问题讨论】:

  • 你应该把接受输入 fx 的 if/else 状态放在 Math 类中。使用字符串作为函数名太复杂了
  • 您正在寻找反射或更好的代码结构。
  • 你的意思是function还是method
  • 为什么一开始会有一个字符串?例如,这是来自用户通过控制台输入的吗?
  • @MandarPandit Java 中没有函数。

标签: java string function


【解决方案1】:

您正在寻找的是 Java 中的反射。

看看这个话题: How do I invoke a Java method when given the method name as a string?

如果没有对异常进行必要的检查,您的代码可能看起来像这样:

//assume that you have an Object that you want to invoke the method on
MyObject obj = new MyObject();
//the variable `method` will hold your function
java.lang.reflect.Method method;
//paremters can be provided to identify a specific method among overloaded methods
method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
//invoke the method of your object
method.invoke(obj, arg1, arg2,...);

【讨论】:

  • 这应该是一个评论,因为它没有提供问题的答案
  • 谢谢你们,我试图在我编辑的答案中展示引用帖子的精髓。
【解决方案2】:

你想要做的最简单的方法是..

您可以使用 if else 或 switch 轻松做到这一点

   calc("cos", Math.PI);

在函数中检查为

 if(stringValue.equals("cos")){
  call the cos function
 }

【讨论】:

  • 你会在所有可能的场景中都这样写吗?
  • 我认为鉴于 OP 提供的有限示例,这是一个很好的建议。
  • @AbimaranKugathasan 取决于要求..如果有 2 或 3 个函数那么没关系..否则可以使用多种方法来动态解决它..
【解决方案3】:

Java 提供了一个名为reflection 的工具。这提供了按名称访问方法、变量等的方法。大多数这些设施都在 java.lang.Class 对象上。

  • Class.getMethod(name, args) 在 java.lang.Math 上获取 java.reflect.Method 参考
  • 使用 method.invoke(null, args) 调用方法引用。这里的 null 是实例,对静态方法没有意义

代码

public static void main(String[] args) throws Exception {
    System.out.println(calc("cos", Math.PI));
    System.out.println(calc("sin", Math.PI /2));
}

public static double calc(String fx, double arg) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
    return (Double) Math.class.getMethod(fx, double.class).invoke(null, arg);
}

【讨论】:

    【解决方案4】:

    不,您可以使用设计模式或通过 switch 实现:

    switch (command) {
    case "cos" : return Math.cos(dblParam);
    }
    

    【讨论】:

      【解决方案5】:

      我建议您重新考虑这是否是一个好主意,但是您可以这样做。

      public static double calc(String fx, double arg) {
          try {
              Method math = Math.class.getMethod(fx, double.class);
              return (Double) math.invoke(null, arg);
          } catch (Exception e) {
              throw new IllegalArguementException(e);
          }
      }
      

      【讨论】:

        【解决方案6】:

        你需要使用反射api如下:

        String methodName = "cos";
        double arg = Math.PI;
        
        try {
            Method method = Math.class.getDeclaredMethod(methodName,
                    double.class);//get cos method from math class that accepts double as parameter
            method.setAccessible(true);//i trust this call
            double time = (Double) method.invoke(null, arg);//invoke the method with PI
            System.out.println(time);
        } catch (Exception e) {//handle all exceptions or individual according to business need
            e.printStackTrace();
        }
        

        【讨论】:

          【解决方案7】:

          真的不容易。您可以定义 Map 以将名称与方法(或更好的功能接口)相关联,或使用反射。

          例如(使用函数式接口,Java 7 语法):

          // Define functions
          final Runnable cosFunction = new Runnable() {    
              @Override
              public void run() {
                  // Do cosine
              }
          }
          
          // Store functions
          Map<String, Runnable> functionMap = new HashMap<>();
          functionMap.put("cos", cosFunction);
          
          // Retrive functions
          final Runnable function = functionMap.get("cos");
          function.run();
          

          请注意,使用 Runnable 不允许您返回值。

          在函数式编程中这要容易得多,我建议你研究基于 JVM 的 Clojure 或 Scala。

          【讨论】:

            猜你喜欢
            • 2016-07-09
            • 2013-07-08
            • 2020-04-20
            • 1970-01-01
            • 2021-09-30
            • 1970-01-01
            • 2013-02-16
            • 2020-04-24
            • 2013-06-08
            相关资源
            最近更新 更多