【发布时间】:2016-08-23 07:42:30
【问题描述】:
通过返回ImmutableTable<R,C,V>的方法处理字符串列表。例如ImmutableTable<Integer,String,Boolean> process(String item) { /*...*/}。
收集结果,即合并所有结果(单个表可能包含重复)并返回ImmutableTable。
当没有重复时,我当前的实现工作:
final ImmutableTable<Integer, String, Boolean> result =
itemsToProcess.parallelStream()
.map(item ->
ProcessorInstanceProvider.get()
.buildTable(item))
.collect(toImmutableTable());
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<R, C, V>::new,
ImmutableTable.Builder<R, C, V>::putAll,
(
a,
b) -> a.putAll(b.build()),
ImmutableTable.Builder::build);
}
但在收集 ImmutableTable 时失败,因为存在重复的行列条目,因此构建失败。
如何防止构建失败?我如何使用 HashBaseTable 来处理重复项。 T - ImmutableTable, A - HashBasedTable 和 R - ImmutableTable 之类的内存使用量最少?
尝试过:
final HashBasedTable<Integer, String, Boolean> result =
listOfItems.parallelStream()
.map(item ->
ProcessorInstanceProvider.get()
.build(item) )
.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
为HashTable::putAll。
我们如何使用HashBasedTable 作为累加器来收集ImmutablesTable,因为HashBasedTable 用最新的条目覆盖现有条目,并且如果我们尝试放置重复条目并返回聚合的不可变表也不会失败。
【问题讨论】:
-
IllegalAccessError看起来像一个编译器错误。尝试用等效的 lambda 表达式替换方法引用。我依稀记得在这里看到过类似的问题。 -
你想对重复项做什么?
-
对于重复项,我只想用 HashBasedTable 所做的最新条目覆盖它。
-
用 Lambda 表达式替换它们并且它起作用了。谢谢。
标签: java java-8 guava collectors