【问题标题】:java 8 - store method in HashMap and get return value from method in mapjava 8 - 在 HashMap 中存储方法并从 map 中的方法获取返回值
【发布时间】:2016-12-18 08:24:07
【问题描述】:

我想将方法​​指针存储在映射中,以根据字符串值执行它们。 Аrom 我发现的,我可以使用Map<String, Runnable> 来做,但问题是我想从方法中获取返回值。

假设我有这样的事情:

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

方法config.getMinutesValues()来自另一个类。

我该如何做int value = timeUnitsMap.get("minutes").run(); 或在地图中存储其他内容(而不是Runnable)以便从地图中的函数中获取值?

【问题讨论】:

  • 你知道你可以写config::getMinutesValues而不是() -&gt; config.getMinutesValues()吗?

标签: java lambda java-8 functional-interface


【解决方案1】:

Runnable 不返回值。您应该改用SupplierCallable

SupplierCallable 之间的主要区别在于Callable 允许您抛出已检查异常。然后,您必须在使用Callable 的任何地方处理该异常的可能性。 Supplier 可能更适合您的用例。

您需要将Map&lt;String, Runnable&gt; 更改为Map&lt;String, Supplier&lt;Integer&gt;&gt;。 lambda 函数本身不需要更改。

@assylias 在评论中指出您也可以使用Map&lt;String, IntSupplier&gt;。使用IntSupplier 可以避免将int 装箱为Integer

【讨论】:

  • 在这种情况下更可能是IntSupplier
  • @assylias 好主意!那是我不会想到的。
  • 感谢您的回答。我确实有另一个问题,编辑了原始问题。非常感谢您的回答。
  • @OfekAgmon 请取消您的编辑,并提出另一个单独的问题。您的原始问题已得到解答。
  • 同意;每个帖子一个问题使网站井井有条。不过,请随意发布另一个单独的问题,我很乐意看看。
【解决方案2】:

使用Callable 代替Runnable

【讨论】:

    【解决方案3】:

    你需要使用 Callable 而不是 Runnable 并且你需要重写 call() 方法。

    你可以从下面的sn-p中得到线索:

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

    你还需要重写 call() 方法,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2015-08-14
      • 1970-01-01
      相关资源
      最近更新 更多