假设我有一个货币汇率加载器,仅在成功加载所有汇率后才返回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 = false;
变量不是final或实际上不是final时,不允许在lambda函数中分配isLoaded
。哪个是在lambda表达式内设置/删除 boolean 标志的最优雅解决方案?
您如何看待AtomicBoolean和set(false)方法作为可能的方法?
最佳答案
正如其他人所建议的,使用老式循环可能会更好。编写带有副作用的lambda确实有点像在编程方面,但您可能会发现有很多认为这还不错的开发人员。
至于使这种带有副作用的lambda起作用,将isLoaded
变成AtomicBoolean
可能是最好的选择。您可以通过将isLoaded
设置为大小为1的boolean[]
来实现相同的效果,但是这对我来说似乎比使用AtomicBoolean
优雅。
但认真的说,也尝试使用老式循环,看看哪个更喜欢。