有没有一种方法可以像python一样在android/Java中定义函数字典?
在python中,可以创建函数字典(有没有一种方法可以像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中,
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");
}
}
}