9

我正在玩 Java 8,我知道这必须通过阅读文档来实现,我只是不知道该怎么做。

我有以下工作代码:

    long factorProduct = LongStream.rangeClosed(1, maxFactor)
            .filter(this::isOptimalFactor)
            .reduce((i, j) -> i * j)
            .getAsLong();
    List<Long> primeFactors = primeFactors(factorProduct);

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

现在我想将它转换为一个Map<Long, Long>作为键的元素和作为值的出现。

我以为:

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

会工作,但它不会。我在 java.util.stream.Collectors 文档中查找了示例。

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

4

2 回答 2

13

如果要对元素进行分组,则必须使用groupingBy

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

Map<Long, Long> primeFactorCount = primeFactors.stream()
        .collect(groupingBy(p -> p, counting()));
于 2014-02-23T21:12:53.220 回答
2

如果您使用Eclipse Collections,您可以使用以下主要因素列表和主要因素计数。ABag基本上是一个Map<K, Integer>

MutableList<Long> primeFactors = this.primeFactors(factorProduct); 
Bag<Long> primeFactorCount = primeFactors.toBag();

在上面的 primeFactors 方法中使用 a FastList

对于 Eclipse Collections,我们有原始的 Lists 和 Bags,因此您不需要对任何结果进行装箱。

LongList primeFactors = this.primeFactors(factorProduct);   
LongBag primeFactorCount = primeFactors.toBag();

在上面的 primeFactors 方法中使用 aLongArrayList代替。

注意:我是 Eclipse Collections 的提交者。

于 2014-02-25T22:30:21.140 回答