小编典典

Java 8 Lambda的问题,可在增加计数时实现有效的最终处理

java

我想在以下情况下使用Java 8 Lambda表达式,但是我 在封闭范围中定义的本地变量fooCount必须是final或有效的final
。我理解的错误消息说什么,但我需要在这里计算比例,从而需要增加fooCountbarCount再计算百分比。那么实现它的方式是什么:

        // 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但我想避免使用它,因此,如果可能的话,以后我想在这里使用并行流。


阅读 568

收藏
2020-11-30

共1个答案

小编典典

count流中有一种方法可以为您计数。

long fooCount = map.keySet().stream().filter(k -> k.contains("FOO")).count();
long barCount = map.size() - fooCount;

如果要并行化,请更改.stream().parallelStream()

另外,如果您尝试手动增加变量并使用流并行化,则可能需要使用类似的方法AtomicLong来提高线程安全性。即使编译器允许,简单变量也不是线程安全的。

2020-11-30