有没有一种方法可以像python一样在android/Java中定义函数字典?

有没有一种方法可以像python一样在android/Java中定义函数字典?,java,android,python,dictionary,Java,Android,Python,Dictionary,在python中,可以创建函数字典(foo,bar),并通过访问Dictionares元素调用它们: d = {'a':foo, 'b':bar} d[val]() 在本例中,如果var='a'调用函数foo,如果var='b'调用函数bar(其他选择会导致错误) 我可以在android/Java中这样做吗?在Java字典中,我们将其称为HashTable/HashMap 请看一下这些课程。 哈希表示例: 希望这对您有所帮助:)在Python中这很容易,因为方法非常简单。而在Java中,

在python中,可以创建函数字典(
foo,bar
),并通过访问Dictionares元素调用它们:

d = {'a':foo, 'b':bar}
d[val]()
在本例中,如果
var='a'
调用函数
foo
,如果
var='b'
调用函数
bar
(其他选择会导致错误)


我可以在android/Java中这样做吗?

在Java字典中,我们将其称为HashTable/HashMap

请看一下这些课程。

哈希表示例:


希望这对您有所帮助:)

在Python中这很容易,因为方法非常简单。而在Java中,它们不是

但是,在Java8中,您可以创建
Runnable的
Map
(在本例中是
HashMap

Map<Character, Runnable> methods= new HashMap<>();
methods.put('help', () -> System.out.println("Help"));
您也可以使用反射来实现,但代码看起来非常像这样。

import java.util.*;
import java.util.*;

class HashMethod {
    public void foo() {
        System.out.println("foo");
    }

    public void bar() {
        System.out.println("bar");
    }

    public static void main(String[] args) throws IllegalAccessException {
        HashMethod obj = new HashMethod();
        Map<Character, java.lang.reflect.Method> methods = new HashMap<Character, java.lang.reflect.Method>();
        try {
            Character val = 'a';
            java.lang.reflect.Method method = obj.getClass().getMethod("foo");
            methods.put(val, method);
            Character val2 = 'b';
            java.lang.reflect.Method method2 = obj.getClass().getMethod("bar");
            methods.put(val2, method2);
        } catch (SecurityException e) {
            System.out.print("exc1" + e.toString());
        } catch (NoSuchMethodException e) {
            System.out.print("exc2" + e.toString());
        }
        Scanner s = new Scanner(System.in);
        Character val = s.next().charAt(0);
        try {
            java.lang.reflect.Method methodToRun = ((java.lang.reflect.Method) methods.get(val));
            methodToRun.invoke(obj, null);
        } catch (Exception e) {
            System.out.print("invalid input");
        }
    }
}
类哈希方法{ 公共图书馆{ System.out.println(“foo”); } 公共空白栏(){ 系统输出打印项次(“bar”); } 公共静态void main(字符串[]args)引发IllegalAccessException{ HashMethod obj=新的HashMethod(); Map methods=newhashmap(); 试一试{ 字符val='a'; java.lang.reflect.Method=obj.getClass().getMethod(“foo”); 方法:put(val,method); 字符val2='b'; java.lang.reflect.MethodMethod2=obj.getClass().getMethod(“bar”); 方法:put(val2,method2); }捕获(安全异常e){ 系统输出打印(“exc1”+e.toString()); }捕获(无此方法例外){ 系统输出打印(“exc2”+e.toString()); } 扫描仪s=新的扫描仪(System.in); 字符val=s.next().charAt(0); 试一试{ java.lang.reflect.methodToRun=((java.lang.reflect.Method)methods.get(val)); methodorun.invoke(obj,null); }捕获(例外e){ 系统输出打印(“无效输入”); } } }
您的问题是如何将函数放入
HashMap
?或者是否有类似python的语法来构建
HashMap
?是否有一种方法可以以类似的优雅方式实现我在Java中用python编写的东西?那么函数的类型是什么?必须使用HashTable或HashMap类。请检查上面给出的示例链接,我知道我可以这样做。但这是一种非常丑陋的方式。我希望有一种更优雅的方法来实现这一点,就像在python中一样……这并不能回答问题。。。代码不能是动态的(例如,在运行时添加/删除一个可能的操作),对于一个健全的代码库来说,也不可能有成百上千的操作。好的,
Runnable
自JDK 1以来就存在,并且没有任何东西阻止您将接口实现为
RunFoo
RunBar
。。。这就是GoF的“命令模式”。Java 8只提供lambda函数,可以避免编写一个完整的
可运行的
实现来在字典中插入一个值。是的,但在这一点上,它开始变得更不符合Python,我认为OP正在寻找尽可能符合Python的东西。我正在寻找符合Python的东西。我可以用if语句来做,但是我认为这是糟糕的编程风格。我还需要使用if参数。我将使用if语句,不管怎样……我尝试了
LOG_FOO.put('v',()->this.v)导致错误“表达式的非法开始”
import java.util.*;

class HashMethod {
    public void foo() {
        System.out.println("foo");
    }

    public void bar() {
        System.out.println("bar");
    }

    public static void main(String[] args) throws IllegalAccessException {
        HashMethod obj = new HashMethod();
        Map<Character, java.lang.reflect.Method> methods = new HashMap<Character, java.lang.reflect.Method>();
        try {
            Character val = 'a';
            java.lang.reflect.Method method = obj.getClass().getMethod("foo");
            methods.put(val, method);
            Character val2 = 'b';
            java.lang.reflect.Method method2 = obj.getClass().getMethod("bar");
            methods.put(val2, method2);
        } catch (SecurityException e) {
            System.out.print("exc1" + e.toString());
        } catch (NoSuchMethodException e) {
            System.out.print("exc2" + e.toString());
        }
        Scanner s = new Scanner(System.in);
        Character val = s.next().charAt(0);
        try {
            java.lang.reflect.Method methodToRun = ((java.lang.reflect.Method) methods.get(val));
            methodToRun.invoke(obj, null);
        } catch (Exception e) {
            System.out.print("invalid input");
        }
    }
}