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

时间:2016-12-18 08:24:07

标签: java lambda java-8 functional-interface

我想在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)才能从地图中的函数中获取值?

3 个答案:

答案 0 :(得分:9)

Runnable没有返回值。您应该使用SupplierCallable代替。

SupplierCallable之间的主要区别在于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;
}