gpt4 book ai didi

java - 在 lambda 表达式 Java 中使用 Final 变量

转载 作者:行者123 更新时间:2023-12-02 12:23:36 25 4
gpt4 key购买 nike

我有一个可以获取大量数据的应用程序,因此我想将数据分页成 block 并单独处理这些 block ,而不是一次处理所有数据。所以我写了一个函数,每 n 秒调用一次来检查一个 block 是否完成,然后处理该 block 。我的问题是我无法跟踪我刚刚处理了一个 block 并且我应该在下一个 block 可用时移动到它的事实。我正在思考下面代码中的一些内容,但是我无法调用 multiplier++; 因为它提示它的行为不再像最终变量一样。我想使用乘法器之类的东西,这样一旦代码处理一个 block ,它 1)不会再次处理相同的 block ,2)移动到下一个 block 。是否有可能做到这一点?是否有可以添加乘数的修饰符来帮助避免竞争条件?

int multiplier = 1;
CompletableFuture<String> completionFuture = new CompletableFuture<>();

final ScheduledFuture<?> checkFuture = executor.scheduleAtFixedRate(() -> {
// parse json response
String response = getJSONResponse();
JsonObject jsonObject = ConverterUtils.parseJson(response, true)
.getAsJsonObject();

int pages = jsonObject.get("stats").getAsJsonObject().get("pages").getAsInt();

// if we have a chunk of n pages records then process them with dataHandler function
if (pages > multiplier * bucketSize) {
dataHandler.apply(getResponsePaginated((multiplier - 1) * bucketSize, bucketSize));
multiplier++;
}
if (jsonObject.has("finishedAt") && !jsonObject.get("finishedAt").isJsonNull()) {
// we are done!
completionFuture.complete("");
}

}, 0, sleep, TimeUnit.SECONDS);

最佳答案

您可以使用AtomicInteger 。由于这是一个可变类型,因此您可以将其分配给 final 变量,同时仍然能够更改其值。这也解决了回调之间的同步问题:

final AtomicInteger multiplier = new AtomicInteger(1);
executor.scheduleAtFixedRate(() -> {
//...
multiplier.incrementAndGet();
}, 0, sleep, TimeUnit.SECONDS);

关于java - 在 lambda 表达式 Java 中使用 Final 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45599812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com