java - BukkitRunnable 的返回值
问题描述
我使用 BukkitRunnable 向地图异步添加值,然后我想返回地图。
public Map<String, Object> test() {
final Map<String, Object> testMap = new HashMap<>();
new BukkitRunnable() {
@Override
public void run() {
testMap.put("A", 1);
testMap.put("B", 2);
}
}.runTaskAsynchronously(bridge);
return testMap;
}
如果我想使用这张地图,它将永远是空的。在将值添加到地图之前返回它,因为我将它们添加到另一个线程中。
我真的想使用 BukkitRunnable 而不是 Future。我怎样才能做到这一点?我需要延迟归还地图,或者更好的是,以某种方式从 BukkitRunnable 归还地图。
解决方案
问题是Map
将直接返回,但任务将异步运行,因此您将得到一个空Map
返回。所以你应该Consumer
在方法中添加一个来获取异步结果。
尝试这个:
public void test(Consumer<Map<String, Object>> callback) {
final Map<String, Object> yourMap = new HashMap<>();
new BukkitRunnable() {
@Override
public void run() {
yourMap.put("A", something);
yourMap.put("B", 1.5);
callback.accept(yourMap); //here the consumer gets the map
}
}.runTaskAsynchronously(bridge);
}
使用 lambda:
...
referenceToClass.test(map -> { //Lambda
Object someObject = map.get("A");
});
使用正常:
...
referenceToClass.test(new Consumer<Map<String, Object>() {
@Override
public void accept(Map<String, Object> map) {
Object someObject = map.get("A");
}
});
推荐阅读
- javascript - 使用 javascript 检查 css 文件中的选择器重复项
- git - 从已经在 PR 中的 PR 中排除提交
- mysql - SQL - 在 Mysql 中将一列拆分为两列
- c++ - 类成员重新排序
- c - 生成遵循特定分布的随机双打
- javascript - You Don't Know JS: Up & Going - 示例问题
- javascript - 使用 G-Sheet 中的 SDK v8 打印到 Dymo 失败
- java - Hibernate + JPA:非空属性引用空值或瞬态值
- sql-server - SQL Server - 合并时合并重复键上的数据
- python - 抓取Androidy Store BeautifulSoup / Selenium时弹出问题