如何从lambda表达式返回一个值?

时间:2015-12-17 10:56:23

标签: java lambda java-8

我有一个集合(concurrentHashMap)和一个方法,它应该在一个单独的线程中工作并返回numOfApples

public int getApples(String treeNum) {
    int numOfApples = null;
    Runnable task = () -> {concurrentHashMap.get(treeNum).getApples(); };
    new Thread(task).start() ;
    return numOfApples;
}

是否可以将lambda表达式(concurrentHashMap.get(treeNum).getApples())中的num个数量传递给numOfApples变量?

1 个答案:

答案 0 :(得分:4)

问题不在于从lambda表达式返回值。它是关于从异步任务返回结果。

您无法使用Runnable轻松完成此操作。您应该使用Callable来引用其Javadoc:

  

返回结果并可能抛出异常的任务。

另外,you definitely should not be creating unmanaged raw threads like that: new Thread(task).start();. You should use an ExecutorService and submit the Callable to it

请考虑以下代码:

public int getApples(String treeNum) {
    Callable<Integer> task = () -> concurrentHashMap.get(treeNum).getApples();
    Future<Integer> future = Executors.newCachedThreadPool().submit(task);
    return future.get();
}

它会创建一个Callable<Integer>来保存任务,返回苹果的数量。此任务提交给ExecutorService(我在这里只使用了一个缓存的线程池,您可能需要另一个)。结果包含在Future<Integer>实例中,其get()方法将阻塞,等待结果然后返回。