ユースケース: type
を返すメソッドを介して文字列のリストを処理します。例えばImmutableTable
{R,C,V}
ImmutableTable of {Integer,String,Boolean} process(String item){...}
結果を収集します。つまり、すべての結果をマージして を返しImmutableTable
ます。それを達成する方法はありますか?
現在の実装(ボヘミアンの提案による):
並列ストリームを使用するのはどうですか? 以下のコードに並行性の問題はありますか? 並列ストリームを使用すると、tableBuilder.build() で「インデックス 1800 で NullPointerException」が発生しますが、ストリームでは問題なく動作します。
ImmutableTable<Integer, String, Boolean> buildData() {
// list of 4 AwsS3KeyName
listToProcess.parallelStream()
//Create new instance via Guice dependency injection
.map(s3KeyName -> ProcessorInstanceProvider.get()
.fetchAndBuild(s3KeyName))
.forEach(tableBuilder::putAll);
return tableBuilder.build(); }
以下のコードは、ストリームと並列ストリームでうまく機能します。しかし、行と列のエントリが重複しているため、ImmutableBuild は失敗しています。テーブルのマージ中に重複を防ぐ最善の方法は何ですか?
public static <R, C, V> Collector<ImmutableTable<R, C, V>,
ImmutableTable.Builder<R, C, V>, ImmutableTable<R, C, V>>
toImmutableTable()
{
return Collector.of(ImmutableTable.Builder::new,
ImmutableTable.Builder::putAll, (builder1, builder2) ->
builder1.putAll(builder2.build()), ImmutableTable.Builder::build); }
編集:異なるテーブルのマージ中に ImmutableTable.Builder に重複するエントリがある場合、失敗します。
ImmutableTables を HashBasedTable に配置して失敗を回避しようとする
ImmutableTable.copyOf(itemListToProcess.parallelStream()
.map(itemString ->
ProcessorInstanceProvider.get()
.buildImmutableTable(itemString))
.collect(
Collector.of(
HashBasedTable::create,
HashBasedTable::putAll,
(a, b) -> {
a.putAll(b);
return a;
}));
)
しかし、「原因: java.lang.IllegalAccessError: クラス com.google.common.collect.AbstractTable にアクセスしようとしました」という実行時例外が発生します。
HashBasedTable は既存のエントリを最新のエントリで上書きし、重複するエントリを配置しようとしても失敗せず、集計された Immutable テーブルを返すため、HashBasedTable をアキュムレータとして使用して ImmutablesTables を収集するにはどうすればよいでしょうか。