假设我有一个货币汇率加载器,仅在成功加载所有汇率后才返回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优雅。

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

10-01 23:14