如何在lambda被提供给调用方法的结果中分配变量时,如何在lambda中使用变量?

Cod*_*ove 3 java lambda java-8

我有一个方法TaskManager.newRepeatingTask(Runnable r, long delay, long interval),它返回一个UUID.我为该UUID方法返回的内容分配了一个变量,我想在其中使用该变量Runnable.我将如何有效地完成这项工作,或者我将在这里完成的工作?

UUID id = TaskManager.newRepeatingTask(() -> {
    for (int i = 0; i < profileButtons.length; i++) {
        GuiButton button = profileButtons[i];
        button.move(-1, 0);
    }
    toMove--;
    if (toMove == 0) {
        // id: "The variable may not have been initialized"
        TaskManager.cancelTask(id);
    }
}, 30L, 0L);
Run Code Online (Sandbox Code Playgroud)

Stu*_*rks 5

java.util.concurrent.CompletableFuture当您不确定哪个将首先到达时,使用(Java 8中的新增功能)在线程或任务之间传输值.这是如何做:

CompletableFuture<UUID> id = new CompletableFuture<>();
id.complete(TaskManager.newRepeatingTask(() -> {
    for (int i = 0; i < profileButtons.length; i++) {
        GuiButton button = profileButtons[i];
        button.move(-1, 0);
    }
    toMove--;
    if (toMove == 0) {
        TaskManager.cancelTask(id.join());
    }
}, 30L, 0L));
Run Code Online (Sandbox Code Playgroud)

join()方法将收集并返回该complete()方法提供的值.如果complete()还没有被调用,join()将阻塞直到它.CompletableFuture在内部处理所有同步和内存可见性问题.

正如其他人所指出的那样,这有点人为.重复任务取消自身的更常规方法是让它返回一个布尔值,指示是否应该重新安排或取消它.要做到这一点,改TaskManager.newRepeatingTask()采取Supplier<Boolean>的不是Runnable.