Use case:
Список процессов с помощью метода, который возвращает ImmutableTable
типа {R,C,V}
. Например, ImmutableTable of {Integer,String,Boolean} process(String item){...}
Java 8 collector для Guava неизменяемый стол
Соберите результат i.e, объедините все результаты и верните ImmutableTable
. Есть ли способ достичь этого?
Текущая реализация (как это было предложено артистический):
Как насчет использования параллельного потока? Существуют ли проблемы параллелизма в приведенном ниже коде? С параллельным потоком я получаю «NullPointerException в индексе 1800» на tableBuilder.build(), но отлично работает с потоком.
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); }
Edit: Если есть дубликат записи в ImmutableTable.Builder при объединении различных таблиц, то это не удается,
Пытаясь избежать faluire, поставив 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 в качестве Аккумулятора для сбора данных ImmutablesTables, поскольку HashBasedTable переопределяет существующую запись последним и не терпит неудачу, если мы попытаемся поместить повторяющуюся запись и вернуть агрегированную неизменяемую таблицу.
Можете ли вы показать код, который не может быть прав? –
FYI: [Guava 21 будет поддерживать Java 8 и будет иметь коллекционеры для своих коллекций] (https://groups.google.com/forum/#!topic/guava-discuss/ZRmDJnAq9T0). – Xaerxess