3

ユースケース: 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 を収集するにはどうすればよいでしょうか。

4

3 に答える 3

3

これはうまくいくはずです:

List<String> list; // given a list of String

ImmutableTable result = list.parallelStream()
    .map(processor::process) // converts String to ImmutableTable
    .collect(ImmutableTable.Builder::new, ImmutableTable.Builder::putAll,
        (a, b) -> a.putAll(b.build())
    .build();

この削減はスレッドセーフです。


またはHashBasedTable中間データ構造として使用:

ImmutableTable result = ImmutableTable.copyOf(list.parallelStream()
    .map(processor::process) // converts String to ImmutableTable
    .collect(HashBasedTable::create, HashBasedTable::putAll, HashBasedTable::putAll));
于 2016-08-17T03:22:42.273 に答える
3

これを行うには、静的ファクトリ メソッドCollectorを使用して適切な を作成します。Collector.of

ImmutableTable<R, C, V> table =
    list.stream()
        .map(processor::process)
        .collect(
            Collector.of(
                () -> new ImmutableTable.Builder<R, C, V>(),
                (builder, table1) -> builder.putAll(table1),
                (builder1, builder2) ->
                    new ImmutableTable.Builder<R, C, V>()
                        .putAll(builder1.build())
                        .putAll(builder2.build()),
                ImmutableTable.Builder::build));
于 2016-08-17T08:48:29.033 に答える