Сборщик Java 8 для неизменного стола Guava
Случай использования:
Обработка списка строк с помощью метода, который возвращаетImmutableTable
типа{R,C,V}
, НапримерImmutableTable of {Integer,String,Boolean} process(String item){...}
Собрать результат, т.е. объединить все результаты и вернуть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); }
Редактировать: если в 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 в качестве Accumulator для сбора ImmutablesTables, так как HashBasedTable переопределяет существующую запись последней и не завершается ошибкой, если мы пытаемся поместить дублирующую запись и вернуть агрегированную таблицу Immutable.