哪个是在lambda函数中设置/删除布尔标志的最佳方法

Ale*_*nin 2 java lambda

假设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)方法作为一种可能的方法?

Cod*_*ind 9

正如其他人所建议的那样,你可能会更好地使用旧式循环.编写带有副作用的lambdas确实感觉有点编程失误,但你可能会发现同样数量的开发人员认为它也没关系.

至于让这种特殊的lambda-with-side效果起作用,制作isLoaded一个AtomicBoolean可能是你最好的选择.你可以通过制作isLoaded1 boolean[]号大小来达到同样的效果,但这似乎不如跟AtomicBoolean我一样优雅.

但是说真的,尝试使用旧式循环,看看你更喜欢哪一个.