【发布时间】:2017-03-22 00:46:50
【问题描述】:
我想在以下场景中使用 Java 8 Lambda 表达式,但我得到 在封闭范围内定义的局部变量 fooCount 必须是最终的或有效的最终。我理解错误消息的内容,但我需要在这里计算百分比,所以需要增加 fooCount 和 barCount 然后计算百分比。那么实现它的方法是什么:
// key is a String with values like "FOO;SomethinElse" and value is Long
final Map<String, Long> map = null;
....
private int calculateFooPercentage() {
long fooCount = 0L;
long barCount = 0L;
map.forEach((k, v) -> {
if (k.contains("FOO")) {
fooCount++;
} else {
barCount++;
}
});
final int fooPercentage = 0;
//Rest of the logic to calculate percentage
....
return fooPercentage;
}
我有一个选择是在这里使用AtomicLong 而不是long,但我想避免它,所以以后如果可能我想在这里使用并行流。
【问题讨论】:
-
也许你应该使用
stream.count() -
如果你能做到这一点,你会得到并行流的竞争条件,除非你使用
AtomicLong。理想情况下,您会使用更实用的样式,例如 khelwood 的答案,它适用于并行流 -
一个简单的解决方案是不要将变量设置为本地变量。如果你让它们成为类的成员,那么你可以很高兴地在 lambda 表达式中更新它们。但是,正如答案所指出的那样,除非您使变量成为原子变量或使用其他同步机制,否则这在并行流中不起作用。