当前位置: 首页 > 面试题库 >

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

江敏学
2023-03-14
问题内容

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


问题答案:

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

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

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

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



 类似资料:
  • 因此,我尝试使用treeMap来创建数据集合,然后我希望在使用自己的比较器时获得一个排序列表。 我的问题是collections.sort会引发错误,因为的实例,但我的extsListed是ArrayList类型,它确实是可迭代的,如http://docs.oracle.com/javase/8/docs/api/java/util/list.html所示

  • 我需要向现有的Kafka主题添加分区。我知道可以使用bin/kafka主题。sh脚本来实现这一点,但我更愿意通过融合的RESTAPI来实现这一点。 据我所见,api引用中没有记录在案的endpoint,但我想知道这里是否有其他人能够做到这一点。 编辑:由于在这里似乎不可能使用REST api,我想知道在容器化设置中向现有主题添加分区的最佳实践是什么。例如,如果有将客户ID映射到特定分区的自定义分区

  • 在PyCharm中,终端的最大宽度似乎为265个字符。 要查看这一点,请在PyCharm终端中的python提示符下运行以下命令: PyCharm中是否有增加线宽限制的设置? 我想打印出比这更长的行,以与其他程序的输出进行比较。 我意识到我可以将Python的输出写到一个文件中,但是为了快速调试,打印到终端上通常更方便。

  • 到目前为止,我认为有效的final和final或多或少是等价的,如果在实际行为中不完全相同,JLS会将它们视为相似的。然后我发现了这个人为的场景: 显然,JLS在这两者之间产生了重要的区别,我不知道为什么。 我阅读其他线程,如 最终和有效最终之间的差异 有效的最终变量vs最终变量 变量“有效最终”是什么意思 但他们并没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎相当。但深入研究,他们显然有所不

  • 问题内容: 我希望这个问题对于本论坛来说不是太基本了,但是我们会看到的。我想知道如何重构一些代码以获得更好的性能,而这些性能已经运行了很多次。 假设我正在使用地图(可能是HashMap)创建一个单词频率列表,其中每个键是一个带有要计数单词的字符串,并且值是一个整数,每次找到该单词的标记时,该值就会递增。 在Perl中,增加这样的值非常容易: 但是在Java中,它要复杂得多。这是我目前的操作方式:

  • 我已经提出了几个解决方案,但我认为它们的效率不高,而且我很难计算它们的复杂性。 计划A)对于我随机选择的[1,N]范围内的每一个整数,我检查它是否被占用。如果是,我重新滚动直到我得到一个未被占用的整数。这对于N的高阶数来说变得低效,因为碰撞非常高。 计划B)每次迭代时,我遍历数组的所有值,那些我没有占用的我会写在一个列表中。之后,我洗牌列表(例如通过Fisher-Yates shuffle?)并任