我想在不可变的Guava多集总数(> 2)上创建一个不可变的视图。多重集在列表中。我不想将内容复制到新的多集中。我可能可以使用Multisets.sum(Multiset, Multiset)并减少它的多重集流,但是为每个中间步骤创建一个汇总的多重集似乎有点浪费。有没有更好的办法?

换句话说:我想要一个与Multisets.sum(Multiset, Multiset)类似的方法,但是要有一组多集而不是两个。签名可以是:<T> Multiset<T> sum(List<Multiset<T>>)

最佳答案

实际上,Multisets.sum(Multiset, Multiset)是通过不复制内容而是在两个多集上创建视图的方式实现的,因此在您的情况下,在多集列表上循环并仅将最终结果复制到新的不可变多集就可以了(视图的开销应该对于少量的多集无关紧要)。使用Java 8,您可以将Multiset的sumStream#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/

10-10 12:49