Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将函数映射到数组元素_Java_Arrays_Function_Mapping - Fatal编程技术网

Java 将函数映射到数组元素

Java 将函数映射到数组元素,java,arrays,function,mapping,Java,Arrays,Function,Mapping,我有一个关于在java中映射事物的一般性问题。我并没有完全陷入困境,但我觉得我的方法并不是很好,如果有人想象我的小型私人项目会变得更大,可能会造成问题 假设我有一个数组={1,2,3,4},它不一定是数字,一般来说只是任何符号。 然后我从用户那里得到一个输入,它只能是数组的一部分(不可能有无效的输入)。现在取决于他们选择的元素,一个特定的函数将被执行。我唯一想到的是: switch (input) { case array[0]: doOneThing(); bre

我有一个关于在java中映射事物的一般性问题。我并没有完全陷入困境,但我觉得我的方法并不是很好,如果有人想象我的小型私人项目会变得更大,可能会造成问题

假设我有一个数组={1,2,3,4},它不一定是数字,一般来说只是任何符号。 然后我从用户那里得到一个输入,它只能是数组的一部分(不可能有无效的输入)。现在取决于他们选择的元素,一个特定的函数将被执行。我唯一想到的是:

switch (input) {
   case array[0]:
      doOneThing();
      break;
   case array[1]:
      doAnotherThing();
     break;
   case array[2]:
      doAThirdThing();
      break;
   case array[3]:
      doSomethingElse();
       break;
}

这种方法可行,但扩展起来并不美观。我非常感谢您的每一个想法。

一种可能的方法是,您可以使用输入的值创建函数名。例如,如果他们输入1,您将调用“function1”,或者如果您输入2,您将调用“function2”。然后,您可以使用反射按方法的字符串名称调用该方法


类似于

的内容听起来像是您想看看Java反射Api

Class c=Class.forName("xxxx")
其中{xxxx}是您根据参数构造的字符串

您可以类似地调用方法名


注意——漂亮的代码往往要付出一定的代价——无论是可读性、性能还是安全性(尤其是在反射的情况下)。就我个人而言,我并不介意一个很长的switch语句——它可能并不漂亮,但它永远不会咬你。

你的switch语句中必须有常量,这样你指定的语句就不会起作用。作为一个例子,你可以这样做。您不限于使用
Runnable
lambdas。可以使用任何函数接口,并在调用时提供适当的参数

请注意,允许调用
any
类的
any
方法不是一个好主意,因为它可能导致意外的结果或安全问题,具体取决于如何使用它

public class ThisClass {
    
    public static void main(String[] args) {
        Map<String, Runnable> map = new HashMap<>();
        ThisClass tc = new ThisClass();
        
        map.put("A", () -> tc.doOneThing());
        map.put("B", () -> tc.doAnotherThing());
        map.put("C", () -> tc.doAthirdThing());
        map.put("D", () -> tc.doSomethingElse());
        
        for (String str : new String[] { "A", "B", "Q", "C", "D", "E" }) {
            map.getOrDefault(str, () -> tc.defaultMethod()).run();
        }
    }
    
    public void doOneThing() {
        System.out.println("Doing one thing");
    }
    
    public void defaultMethod() {
        System.out.println("Executing default");
    }
    
    public void doAnotherThing() {
        System.out.println("Doing Another thing");
    }
    
    public void doAthirdThing() {
        System.out.println("Doing a third thing");
    }
    
    public void doSomethingElse() {
        System.out.println("Doing something Else");
    }
}
你也可以这样做

Map<String, DoubleBinaryOperator> map = new HashMap<>();

map.put("+", (a, b) -> a + b);
map.put("-", (a, b) -> a - b);
map.put("*", (a, b) -> a * b);
map.put("/", (a, b) -> a / b);

DoubleBinaryOperator error = (a, b) -> {
    throw new IllegalArgumentException();
};

for (String str : new String[] { "+", "-", "L", "/", "*" }) {
    try {
        double result = map.getOrDefault(str, error)
                .applyAsDouble(2.0, 3.0);
        System.out.println("result = " + result);
    } catch (IllegalArgumentException iae) {
        System.out.println("unknown operator \"" + str + "\"");
    }
}

你试过编译这个结构吗?Case目标必须是常量,数组元素不符合那个要求。是的,我得到了那个错误。所以我的方法根本不起作用。您知道如何生成常量数组吗?BruchGUI.java:12:18:错误:预期的map.put(“+”,()->obj1.foo(obj2));^obj1和obj2是另一个类的对象
Map<String, DoubleBinaryOperator> map = new HashMap<>();

map.put("+", (a, b) -> a + b);
map.put("-", (a, b) -> a - b);
map.put("*", (a, b) -> a * b);
map.put("/", (a, b) -> a / b);

DoubleBinaryOperator error = (a, b) -> {
    throw new IllegalArgumentException();
};

for (String str : new String[] { "+", "-", "L", "/", "*" }) {
    try {
        double result = map.getOrDefault(str, error)
                .applyAsDouble(2.0, 3.0);
        System.out.println("result = " + result);
    } catch (IllegalArgumentException iae) {
        System.out.println("unknown operator \"" + str + "\"");
    }
}
result = 5.0
result = -1.0
unknown operator "L"
result = 0.6666666666666666
result = 6.0