java—将函数Map到数组元素

biswetbf  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(338)

我有一个关于用javaMap东西的一般性问题。我不是很困,但我觉得我的方法不是很漂亮,可能会造成问题,如果有人会想象我的小私人项目将变得更大。
假设我有一个数组={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;
}

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

dwthyt8l

dwthyt8l1#

switch语句中必须有常量,这样指定的内容将无法工作。你可以这样做作为一个例子。你不局限于使用 Runnable 兰博达斯。可以使用任何函数接口,并在调用时提供适当的参数。
请注意,允许 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
kqhtkvqz

kqhtkvqz2#

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

mccptt67

mccptt673#

听起来你想看看java反射api。

Class c=Class.forName("xxxx")

其中{x}是根据参数构造的字符串。
您可以类似地调用方法名。
请注意-漂亮的代码往往要付出一定的代价-无论是可读性、性能还是安全性(尤其是在反射的情况下)。就我个人而言,我不介意一个很长的switch语句-它可能不漂亮,但它永远不会咬你。

相关问题