将函数映射到数组的元素



我有一个关于在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;
}

这种方法有效,但扩展起来并不美观。我非常感谢所有可能的想法。

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

请注意,允许调用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");
}
}

打印

Doing one thing
Doing Another thing
Executing default
Doing a third thing
Doing something Else
Executing default

你也可以这样做。

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

一种可能的方法是,如果您可以使用函数的输入值创建函数的名称。例如,如果他们输入1,您将调用"1";函数1";或者如果你输入2;函数2";。然后,您可以使用反射通过方法的字符串名称来调用该方法。

像这样的东西。

听起来你想看看Java Reflection Api。

Class c=Class.forName("xxxx")

其中{xxxx}是根据参数构造的字符串。

您可以类似地调用方法名称。

请注意,漂亮的代码往往会付出一些代价——无论是可读性、性能还是安全性(尤其是在反射的情况下(。就我个人而言,我不介意长话短说——它可能不好看,但它永远不会咬你。

最新更新