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 值。您应该改用 Supplier
或 Callable
。
Supplier
和 Callable
之间的主要区别在于 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;
}
我想在映射中存储方法指针以根据字符串值执行它们。根据我的发现,我可以使用 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 值。您应该改用 Supplier
或 Callable
。
Supplier
和 Callable
之间的主要区别在于 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;
}