2016-12-18 9 views
3

メソッドポインタをマップに格納して、文字列値に基づいてそれらを実行したい。私が見つけたものから、Map<String, Runnable>を使うことができますが、問題はメソッドからの戻り値を取得することです。java 8 - HashMapにメソッドを格納し、マップ内のメソッドから戻り値を取得する

private Map<String, Runnable> timeUnitsMap = new HashMap<String, Runnable>() {{ 
    timeUnitsMap.put("minutes",() -> config.getMinutesValues()); 
}} 

別のクラスからですconfig.getMinutesValues()方法:

は、私がこのような何かを持っていると言います。

マップ内の関数から値を取得するには、のいずれかを(Runnableの代わりに)マップに保存するにはどうすればよいですか?

+1

呼び出し()メソッドをオーバーライドする必要があります - > config.getMinutesValuesを( ) '、' config :: getMinutesValues'と書くことができますか? – Sam

答えて

6

Runnableは値を返しません。代わりにSupplierまたはCallableを使用してください。

SupplierCallableの主な違いは、Callableはチェック例外をスローすることができることです。その場合、Callableを使用するあらゆる場所でその例外の可能性を処理する必要があります。 Supplierはおそらくあなたのユースケースの方が簡単です。

Map<String, Runnable>Map<String, Supplier<Integer>>に変更する必要があります。ラムダ関数自体は変更する必要はありません。

@assyliasは、あなたもMap<String, IntSupplier>というコメントで指摘されています。 IntSupplierを使用すると、intIntegerとしてボクシングを避けることができます。

+1

この特定のケースでは、おそらく 'IntSupplier'です。 – assylias

+1

@assylias素晴らしいアイデア!それは私には起こりませんでした。あなたの答えには – Sam

+0

ありがとう。私は元のものを編集した別の質問があります。あなたの答えに感謝します。 –

0

Runnableの代わりにCallableを使用してください。

0

RunnableではなくCallableを使用する必要があります。また、call()メソッドをオーバーライドする必要があります。

あなたはスニペット以下から手掛かりを得ることができます。

private Map<String, Callable<Integer>> timeUnitsMap = new HashMap<String, Callable<Integer>>(){ 
     {timeUnitsMap.put("minutes",() -> call());}}; 

を、あなたは、同様の代わりに `()の

@Override 
    public Integer call() throws Exception { 
     return 1; 
}