Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8-在HashMap中存储方法并从map中的方法获取返回值_Java_Lambda_Java 8_Functional Interface - Fatal编程技术网

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

Java8-在HashMap中存储方法并从map中的方法获取返回值,java,lambda,java-8,functional-interface,Java,Lambda,Java 8,Functional Interface,我想在映射中存储方法指针,以便根据字符串值执行它们。从我发现的内容中,我可以使用Map来执行此操作,但问题是我想从方法中获取返回值 假设我有这样的东西: private Map<String, Runnable> timeUnitsMap = new HashMap<String, Runnable>() {{ timeUnitsMap.put("minutes", () -> config.getMinutesValues()); }} private

我想在映射中存储方法指针,以便根据字符串值执行它们。从我发现的内容中,我可以使用
Map
来执行此操作,但问题是我想从方法中获取返回值

假设我有这样的东西:

private Map<String, Runnable> timeUnitsMap = new HashMap<String, Runnable>() {{
    timeUnitsMap.put("minutes", () -> config.getMinutesValues());
}}
private Map timeUnitsMap=new HashMap(){{
timeUnitsMap.put(“分钟”,()->config.getMinutesValues());
}}
方法
config.getMinutesValues()
来自另一个类


如何执行
int value=timeUnitsMap.get(“分钟”).run()
或在映射中存储其他内容(而不是
Runnable
),以便从映射中的函数获取值?

Runnable
不会返回值。您应该使用
供应商
可调用

Supplier
Callable
之间的主要区别在于
Callable
允许您抛出选中的异常。然后,无论您在哪里使用
可调用的
,都必须处理该异常的可能性<代码>供应商对于您的用例来说可能更简单

您需要将
地图
更改为
地图
。lambda函数本身不需要更改


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

使用而不是
Runnable

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

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

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

您是否知道可以编写
配置::getMinutesValues
?而不是
()->config.getMinutesValues()
?或者在这种特定情况下更可能编写
IntSupplier
。@assylia是个好主意!我不会想到的。谢谢你的回答。我还有另外一个问题,就是编辑了原来的问题。非常感谢您的回答。@OfekAgmon请取消您的编辑,并提出另一个单独的问题。您原来的问题已得到回答。同意;每个帖子有一个问题可以让网站井然有序。尽管如此,请随意发布另一个单独的问题,我很乐意看一看。
@Override
    public Integer call() throws Exception {
        return 1;
}