将List<Long>转换为计数出现次数的Map<Long, Long>

9
我正在研究Java 8,我知道这一定是可能的,因为我已经阅读了文档,但我无法找到如何操作的方法。
我有以下可用的代码:
    long factorProduct = LongStream.rangeClosed(1, maxFactor)
            .filter(this::isOptimalFactor)
            .reduce((i, j) -> i * j)
            .getAsLong();
    List<Long> primeFactors = primeFactors(factorProduct);

重要的部分是我有一个可能有一些Long数字重复的List<Long>

现在我想将它转换为一个Map<Long, Long>,其中键为元素,值为出现次数。

我认为:

    Map<Long, Long> primeFactorCount = primeFactors.stream()
            .collect(Collectors.counting());

这个方法看起来应该是可行的,但事实上并不行。我查阅了java.util.stream.Collectors文档中的示例。

我需要如何使用这些功能?

2个回答

13

如果您想对元素进行分组,您需要使用 groupingBy

import static java.util.stream.Collectors.*;

Map<Long, Long> primeFactorCount = primeFactors.stream()
        .collect(groupingBy(p -> p, counting()));

我之前尝试过,但出现了错误,结果发现我忘记自动导入java.util.Map了。 - skiwi

2
如果您使用Eclipse Collections,您可以使用以下代码来获取质因数列表和质因数计数。 Bag 基本上是一个 Map<K, Integer>
MutableList<Long> primeFactors = this.primeFactors(factorProduct); 
Bag<Long> primeFactorCount = primeFactors.toBag();

在上面的primeFactors方法中使用FastList
在Eclipse Collections中,我们有原始的列表和包,因此您不需要将任何结果进行装箱。
LongList primeFactors = this.primeFactors(factorProduct);   
LongBag primeFactorCount = primeFactors.toBag();

在上面的primeFactors方法中,使用LongArrayList代替。
注意:我是Eclipse Collections的committer。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接