如何处理Executor/FutureTask流上的lambda表达式?

问题描述 投票:0回答:1

这是我的任务类:

public interface TaskCallback {
    void onTaskCompleted(Boolean result);
    void onTaskFailed(Exception e);
}

public class AsyncTaskExample {
    private final Executor executor = Executors.newSingleThreadExecutor();

    public void executeAsyncTask(TaskCallback callback) {
        FutureTask<Boolean> taskSyncFiles = new FutureTask<>(() -> {
            // task
            return true;
        });

        executor.execute(taskSyncFiles);
        executor.execute(() -> {
            try {
                Boolean result = taskSyncFiles.get();
                callback.onTaskCompleted(result);
            } catch (InterruptedException | ExecutionException e) {
                callback.onTaskFailed(e);
            }
        });
    }
}

我想从另一个方法(Android 中的 Activity)调用异步任务并将回调捕获为 lambda,如下所示:

myTask.executeAsyncTask(result -> {
    System.out.println("Task completed with result: " + result);
}, e -> {
    e.printStackTrace();
});

但无法让它工作。我怎样才能正确地做到这一点?

java lambda executorservice
1个回答
0
投票

使用 2 个单独的 lambda 不会为您提供

TaskCallback
的实例。您有 2 个简单的解决方法。首先,您可以消除对 TaskCallback 的需求并传入两个 Consumer 并处理每个消费者:

public void executeAsyncTask(Consumer<Boolean> onTaskCompleted, Consumer<Exception> onTaskFailed) {
    ...
    executor.execute(() -> {
        try {
            Boolean result = taskSyncFiles.get();
            onTaskCompleted.accept(result);
        } catch (InterruptedException | ExecutionException e) {
            onTaskFailed.accept(e);
        }
    });

或者为

TaskCallback
定义一个包装类并使用 lambda 构造一个包装类:

myTask.executeAsyncTask(new MyTaskCallback(result -> {
    System.out.println("Task completed with result: " + result);
}, e -> {
    e.printStackTrace();
}));

Java记录中的简单定义,您可以调整为适合与Android Java一起使用的类似定义的类:

record MyTaskCallback(Consumer<Boolean> onTaskCompleted, Consumer<Exception> onTaskFailed) implements TaskCallback {
    public void onTaskCompleted(Boolean result) {
        onTaskCompleted.accept(result);
    }

    public void onTaskFailed(Exception e) {
        onTaskFailed.accept(e);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.