我想在不可变的Guava多集总数(> 2)上创建一个不可变的视图。多重集在列表中。我不想将内容复制到新的多集中。我可能可以使用Multisets.sum(Multiset, Multiset)
并减少它的多重集流,但是为每个中间步骤创建一个汇总的多重集似乎有点浪费。有没有更好的办法?
换句话说:我想要一个与Multisets.sum(Multiset, Multiset)
类似的方法,但是要有一组多集而不是两个。签名可以是:<T> Multiset<T> sum(List<Multiset<T>>)
。
最佳答案
实际上,Multisets.sum(Multiset, Multiset)
是通过不复制内容而是在两个多集上创建视图的方式实现的,因此在您的情况下,在多集列表上循环并仅将最终结果复制到新的不可变多集就可以了(视图的开销应该对于少量的多集无关紧要)。使用Java 8,您可以将Multiset的sum
与Stream#reduce
结合使用:
public <T> Multiset<T> sum(final List<Multiset<T>> multisets)
{
return multisets.stream().reduce(ImmutableMultiset.of(), Multisets::sum);
}
编辑
但是,尽管上面的方法不会涉及任何复制,但正如@LouisWasserman指出的那样,最佳解决方案(YMMV)可能只是在新的多集中累积结果:
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的答案)。
关于java - 将几个 Guava 多集合并为一个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43800666/