假设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;
Run Code Online (Sandbox Code Playgroud)
isLoaded = false;当isLoaded变量不是最终的或有效的最终变量时,不允许在lambda函数内赋值.
哪个是在lambda表达式中设置/删除布尔标志的最优雅的解决方案?
您如何看待AtomicBoolean和set(false)方法作为一种可能的方法?
正如其他人所建议的那样,你可能会更好地使用旧式循环.编写带有副作用的lambdas确实感觉有点编程失误,但你可能会发现同样数量的开发人员认为它也没关系.
至于让这种特殊的lambda-with-side效果起作用,制作isLoaded一个AtomicBoolean可能是你最好的选择.你可以通过制作isLoaded1 boolean[]号大小来达到同样的效果,但这似乎不如跟AtomicBoolean我一样优雅.
但是说真的,尝试使用旧式循环,看看你更喜欢哪一个.