Return 来自 BukkitRunnable 的值

Return value from BukkitRunnable

我使用 BukkitRunnable 向地图异步添加值,然后我想 return 地图。

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

如果我想使用这张地图,它将永远是空的。它是 return 在将值添加到地图之前编辑的,因为我将它们添加到另一个线程中。

我真的很想使用 BukkitRunnable 而不是 Future。我怎样才能做到这一点?我需要延迟 return 地图,或者更好的是 return 地图,不知何故,来自 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"); 
    }
});