我想在map中存储方法指针,以便根据字符串值执行它们。根据我的发现,我可以使用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
)才能从地图中的函数中获取值?
答案 0 :(得分:9)
Runnable
没有返回值。您应该使用Supplier
或Callable
代替。
Supplier
和Callable
之间的主要区别在于Callable
允许您抛出已检查的异常。然后,您必须在使用Callable
的任何地方处理该异常的可能性。对于您的用例,Supplier
可能更简单。
您需要将Map<String, Runnable>
更改为Map<String, Supplier<Integer>>
。 lambda函数本身不需要改变。
@assylias在评论中指出您也可以使用Map<String, IntSupplier>
。使用IntSupplier
可以避免将int
列为Integer
。
答案 1 :(得分:0)
使用Callable代替Runnable
。
答案 2 :(得分:0)
您需要使用Callable而不是Runnable,并且还需要覆盖call()方法。
您可以从以下代码段中获取线索:
@Override
public Integer call() throws Exception {
return 1;
}
你也需要覆盖call()方法,
template<typename T>
void readData(vector<T>& v, istream& infile)
{
T temp;
while(getline(infile, temp.whatever) && getline(infile, temp.whatever2))
{
v.push_back(temp);
}
}
int main() {
// Add code for infileA and infileB
vector<myStructA> va;
readData(va, infileA); // or readData<myStructA>(va, infileA); if you prefer
vector<myStructB> vb;
readData(vb, infileB); // or readData<myStructB>(vb, infileB); if you prefer
....
....
return 0;
}