我正在玩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());
会起作用,但事实并非如此。我查看了示例in the java.util.stream.Collectors documentation。
我如何使用这些功能?
答案 0 :(得分:11)
如果要对元素进行分组,则必须使用groupingBy
:
import static java.util.stream.Collectors.*;
Map<Long, Long> primeFactorCount = primeFactors.stream()
.collect(groupingBy(p -> p, counting()));
答案 1 :(得分:2)
如果您使用Eclipse Collections(以前为GS 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的提交者。