其實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