java 8 - 在 HashMap 中存储方法并从 map 中的方法中获取 return 值

java 8 - store method in HashMap and get return value from method in map

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

假设我有这样的东西:

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

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

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

Runnable 没有 return 值。您应该改用 SupplierCallable

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

您需要将 Map<String, Runnable> 更改为 Map<String, Supplier<Integer>>。 lambda 函数本身不需要更改。

@assylias 在评论中指出,您也可以使用 Map<String, IntSupplier>。使用 IntSupplier 可避免将 int 装箱为 Integer.

使用 Callable 而不是 Runnable

您将需要使用 Callable 而不是 Runnable,并且您还需要覆盖 call() 方法。

您可以从以下代码片段中获得线索:

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

您还需要覆盖 call() 方法,

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