其实Multisets.sum(Multiset, Multiset)
是以它不复制内容的方式实现的,而是创建一个超过两个多重集的视图,所以在你的情况下循环遍历多重集列表并且只将最终结果复制到一个新的不可变多重集是好的(视图的开销不应该是对于少数多重分配)。使用Java 8可以结合多集的sum
有Stream#reduce
:
public <T> Multiset<T> sum(final List<Multiset<T>> multisets)
{
return multisets.stream().reduce(ImmutableMultiset.of(), Multisets::sum);
}
编辑
然而虽然,我将不再参与上述方法复制,因为@LouisWasserman指出最优化的解决方案(因人而异)可能是只是积聚在新的多集的结果:
public <T> ImmutableMultiset<T> sum(final List<Multiset<T>> multisets)
{
final ImmutableMultiset.Builder<T> builder = ImmutableMultiset.builder();
multisets.forEach(builder::addAll);
return builder.build();
}
有专门的视图类(见@ OliverGregoire的答案)也是,如果需要的选项。
你能举个例子吗? – notionquest
@notionquest我有一个'List>'',我想要一个不可变的'Multiset ',这些多重音色组合在一起,就像'Multisets.sum(Multiset,Multiset)'一样。这不是一个真正的例子,希望它能澄清我的问题。 –
Rinke
您可以考虑在https://github.com/google/guava/issues上建议添加“Multisets.sum(Multiset ...)”的问题。 – mfulton26