我想在以下情况下使用Java 8 Lambda表达式,但是我 在封闭范围中定义的本地变量fooCount必须是final或有效的final 。我理解的错误消息说什么,但我需要在这里计算比例,从而需要增加fooCount和barCount再计算百分比。那么实现它的方式是什么:
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但我想避免使用它,因此,如果可能的话,以后我想在这里使用并行流。
AtomicLong
long
count流中有一种方法可以为您计数。
count
long fooCount = map.keySet().stream().filter(k -> k.contains("FOO")).count(); long barCount = map.size() - fooCount;
如果要并行化,请更改.stream()为.parallelStream()。
.stream()
.parallelStream()
另外,如果您尝试手动增加变量并使用流并行化,则可能需要使用类似的方法AtomicLong来提高线程安全性。即使编译器允许,简单变量也不是线程安全的。