gpt4 book ai didi

java - 这是在 lambda 函数内设置/删除 boolean 标志的最佳方法

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

假设我有一个货币汇率加载器,仅当所有汇率加载成功时才返回 isLoaded=true 结果:

//List<String> listFrom = Stream.of("EUR", "RUB").collect(toList());
//List<String> listTo = Stream.of("EUR", "CNY").collect(toList());

boolean isLoaded = true;

final FixerDataProvider httpProvider = new FixerDataProvider(maxAttempts);
final List<CurrencyRatePair> data =
listFrom.stream()
.flatMap(from -> {
final List<CurrencyRatePair> result = httpProvider.findRatesBetweenCurrencies(from, listTo);
if (Objects.isNull(result) || result.size() == 0) {
isLoaded = false; //!!!Not working as ineffectively final!!!
}
return result.stream();
}).collect(Collectors.toList());

if (!isLoaded) {
return false;
}

// do smth with loaded data

return true;
isLoaded 变量不是最终变量或实际上最终变量时,不允许在 lambda 函数内进行

赋值 isLoaded = false;

在 lambda 表达式中设置/删除 boolean 标志的最优雅的解决方案是什么?

您认为 AtomicBoolean 和 set(false) 方法作为一种可能的方法怎么样?

最佳答案

正如其他人所建议的那样,使用旧式循环可能会更好。编写带有副作用的 lambda 确实感觉有点编程失礼,但您可能会发现同样数量的开发人员认为这也没什么问题。

为了让这个带有副作用的特定 lambda 发挥作用,将 isLoaded 转换为 AtomicBoolean 可能是您最好的选择。您可以通过将 isLoaded 设置为大小为 1 的 boolean[] 来实现相同的效果,但这对我来说似乎不如使用 AtomicBoolean 优雅。

但是说真的,也尝试使用老式循环,看看您更喜欢哪一个。

<小时/>

如果您使用parallel stream ,您必须使用 AtomicBoolean。因为 boolean[1]并行场景中可能不安全。

关于java - 这是在 lambda 函数内设置/删除 boolean 标志的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713854/

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