が既にpointed out by Louis Wasserman、最も簡単な解決策を使用してList
に収集するコレクタを内蔵しており、後処理工程でImmutableList
に回収要素を転送:
Map<String, Map<String, List<SomeClass>>> someMap =
/* your stream operation */
.collect(groupingBy(x -> getSomeComputedAttribute(x),
groupingBy(x -> getSomeOtherComputedAttribute(x),
collectingAndThen(toList(), ImmutableList::copyOf))));
これは、もちろん、リストの内容全体をコピーするというわずかなパフォーマンスの欠点があります。
自然な解決策は、ビルダーベースのコレクターである。これはまだ、ほとんどすべてのケースでImmutableList
構築するビルダーの内容がコピーされますよう
public static <T> Collector<T,?,List<T>> toImmutableList() {
return Collector.of(
ImmutableList::<T>builder,
ImmutableList.Builder::add,
(b1,b2) -> b1.addAll(b2.build()),
ImmutableList.Builder::build);
}
と
Map<String, Map<String, List<SomeClass>>> someMap =
/* your stream operation */
.collect(groupingBy(x -> getSomeComputedAttribute(x),
groupingBy(x -> getSomeOtherComputedAttribute(x), toImmutableList())));
しかし驚くのようにそれを使用し、これはそれだけのような、任意のパフォーマンスの向上を得ることはありません収集された要素の数が配列の容量と正確に一致する場合は、内部配列を共有します。
それでも、それは、また...将来的に
を更新グアバライブラリの利点を得ることができ、あなたはそれが本当に不変のリストのグアバを実装する必要があるかどうかを再検討することがあります。コピーステップなしで不変なリストを得ることができます:
これは、キー機能の後にgroupingByの第2引数として使用します。また、Java 8の機能を備えたGuavaは現在リリースされていませんが、すぐにリリースされる予定です。 –