java - 如何从 lambda 表达式返回值?

标签 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;
}

是否可以将 num of apples 从 lambda 表达式 (concurrentHashMap.get(treeNum).getApples()) 传递给 numOfApples 变量?

最佳答案

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

使用 Runnable 将无法轻松做到这一点.你应该使用 Callable 相反,引用它的 Javadoc:

A task that returns a result and may throw an exception.

此外,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()方法将阻塞,等待结果然后返回。

关于java - 如何从 lambda 表达式返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34332842/

相关文章:

java - VaadinCDIServlet Cookies.get(请求,常量)

java - 从 native 查询返回单个投影

java - java列表中的addAll方法

c++ - Qt 信号/槽和 C++ Lambda 表达式

JUnit 在继续之前等待

java - Spring Boot项目构建成功并报错

Php - 理解 create_function() - 传递简单变量

python - 在 Python 中将两个元组的第二个元素与 '<' 进行比较失败

java - 如果目录不存在则根据点串包名创建目录

java - 使用转换的 lambda 表达式初始化数组