Java 8 Sammler für Guava Immutable Table

Anwendungsfall
Prozessliste der Zeichenkette über die Methode, die @ zurückgiImmutableTable vom Typ{R,C,V}. Zum BeispielImmutableTable of {Integer,String,Boolean} process(String item){...}

ammeln Sie das Ergebnis, führen Sie alle Ergebnisse zusammen und geben Sie @ zurücImmutableTable. Gibt es eine Möglichkeit, dies zu erreichen?

Aktuelle Implementierung (wie von Bohemian vorgeschlagen):

Wie verwende ich parallelen Stream? Gibt es Parallelitätsprobleme im folgenden Code? Mit Parallel Stream bekomme ich eine "NullPointerException at index 1800" auf tableBuilder.build (), funktioniert aber gut mit Stream.

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(); }

Während Code unten funktioniert, funktioniert er sowohl mit Streams als auch mit parallelen Streams. ImmutableBuild schlägt jedoch fehl, da Zeilen und Spalten doppelt eingegeben wurden. Was könnte der beste Weg sein, um Duplikate beim Zusammenführen von Tabellen zu vermeiden?

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); }

Edit: Wenn beim Zusammenführen verschiedener Tabellen ein doppelter Eintrag in ImmutableTable.Builder vorhanden ist, schlägt dies fehl.

Versuchen Sie, Wertzuwachs zu vermeiden, indem Sie ImmutableTables in HashBasedTable @ einfüge

  ImmutableTable.copyOf(itemListToProcess.parallelStream()
            .map(itemString ->
           ProcessorInstanceProvider.get()
                    .buildImmutableTable(itemString))
                    .collect(
                            Collector.of(
                                    HashBasedTable::create,
                                    HashBasedTable::putAll,
                                    (a, b) -> {
                                        a.putAll(b);
                                        return a;
                                    }));
  )

Aber ich erhalte eine Laufzeitausnahme "Verursacht durch: java.lang.IllegalAccessError: Es wurde versucht, auf die Klasse com.google.common.collect.AbstractTable zuzugreifen".

Wie können wir HashBasedTable als Akkumulator zum Sammeln von ImmutablesTables verwenden, da HashBasedTable den vorhandenen Eintrag mit dem neuesten überschreibt und nicht fehlschlägt, wenn wir versuchen, einen doppelten Eintrag zu setzen und eine aggregierte Immutable-Tabelle zurückzugeben.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage