2016-10-13 6 views
0

機能の辞書(foo,bar)を作成し、辞書の要素にアクセスすることによって、それらを呼び出すことが可能である:PythonのようにAndroid/Javaで関数辞書を定義する方法はありますか? Pythonで

d = {'a':foo, 'b':bar} 
d[val]() 

この例ではvar='a'機能fooが呼び出された場合、およびvar='b'機能barがある場合(他の選択肢はエラーにつながる)。

私はAndroid/Javaのようなことをすることはできますか?

+0

「HashMap」の中に関数を配置する方法は?あるいは、 'HashMap'をビルドするためのpythonのような構文があるかどうか? – Bakuriu

+0

PythonでJavaで同様のエレガントな方法で書いたようなものを実現する方法はありますか? – Alex

答えて

-1

Java辞書では、HashTable/HashMapと呼びます。

このクラスをご覧ください。 https://developer.android.com/reference/java/util/Hashtable.html

ハッシュテーブルの例: https://www.tutorialspoint.com/java/java_hashtable_class.htm

https://developer.android.com/reference/java/util/HashMap.html

・ホープ、この意志はあなたを助け:)

+0

関数の型は何ですか? – Alex

+0

HashTableクラスまたはHashmapクラスを使用する必要があります。上記の例のリンクを確認してください –

0

方法がFirst-Class Citizensているので、これはPythonで簡単です。 Javaでは、そうではありません。 Javaの8で

あなたはまた、反射でそれを行うことができますが、

methods.get('help').run(); 

にそれを実行しRunnable

Map<Character, Runnable> methods= new HashMap<>(); 
methods.put('help',() -> System.out.println("Help")); 

Mapを(この場合はHashMap)を作成することができます-however-コードはこれに非常によく似ています。

+0

JDK 1以降は 'Runnable'が存在し、GoFからの"コマンドパターン "は' RunFoo'と 'RunBar' ...としてインターフェースを実装できません。 Java 8はラムダ関数を提供するだけで、 'Runnable'実装全体を書くことを避け、その辞書に値を挿入することができます。 – Bakuriu

+0

はい、その時点でそれはさらに非平凡になるようになり、私はOPが可能な限り無色のものを探していると思っています –

+1

はい、私はpythonicの形を探しています。私はif文でそれを行うことができますが、私はこの悪いプログラミングスタイルを考慮します。 – Alex

0
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"); 
     } 
    } 
} 
+0

私は私ができることを知っていますそれはこの方法です。しかし、これは非常に醜い方法です。私はPythonのようにこれを行うよりエレガントな方法を期待していました... – Alex

+1

これは質問に答えません...コードは動的に(例えば、実行時に可能なアクションを追加/削除する)日常的なコードベースでは数百/数千のアクションは実際には不可能です。 – Bakuriu

+0

更新を使用して更新 –

関連する問題