【问题标题】:Java 8 collector for Guava ImmutableTable using HashBasedTable as accumulator gives IllegalAccessError使用 HashBasedTable 作为累加器的 Guava ImmutableTable 的 Java 8 收集器给出 IllegalAccessError
【发布时间】: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 - HashBasedTableR - 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


【解决方案1】:

用 Lambda 表达式替换了方法引用,它起作用了。

ImmutableTable.copyOf(itemList.parallelStream()
                    .map(item ->
                            ProcessorInstanceProvider.get()
                            .build(item))
                    .collect(() -> HashBasedTable.create(),
                            (a, b) -> a.putAll(b),
                            (a, b) -> a.putAll(b))
                    );

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多