使用场景:
通过返回类型为{R,C,V}
的ImmutableTable of {Integer,String,Boolean} process(String item){...}
方法处理字符串列表。
收集结果,即合并所有结果并返回ImmutableTable
。是否有实现方法?
当前的实现方法(由Bohemian建议):
使用并行流如何?下面的代码是否存在任何并发问题?使用并行流时,在tableBuilder.build()处出现"NullPointerException at index 1800",但在流中运行正常。
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;
}));
)
但是我遇到了运行时异常“Caused by: java.lang.IllegalAccessError: tried to access class com.google.common.collect.AbstractTable”。
我们如何使用HashBasedTable作为累加器来收集ImmutablesTables,由于HashBasedTable会用最新的条目覆盖现有条目,而且如果我们尝试放置重复的条目,则不会失败,并返回聚合的Immutable表。