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