Guava不可变表的Java 8收集器

sid*_*dss 2 java guava java-8 immutable-collections

用例:
通过返回ImmutableTable类型的方法处理字符串列表{R,C,V}.例如ImmutableTable of {Integer,String,Boolean} process(String item){...}

收集结果,即合并所有结果并返回ImmutableTable.有没有办法实现它?

目前的实施(波希米亚建议):

如何使用并行流?以下代码中是否存在并发问题?使用并行流我在tableBuilder.build()上得到"索引1800处的NullPointerException",但是对流工作正常.

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(); }
Run Code Online (Sandbox Code Playgroud)

虽然下面的代码与流和并行流有关.但是由于row和col的重复输入,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); }
Run Code Online (Sandbox Code Playgroud)

编辑:如果在合并不同的表时ImmutableTable.Builder中有任何重复的条目,那么它会失败,

试图通过将ImmutableTables放在HashBasedTable中来避免faluire

  ImmutableTable.copyOf(itemListToProcess.parallelStream()
            .map(itemString ->
           ProcessorInstanceProvider.get()
                    .buildImmutableTable(itemString))
                    .collect(
                            Collector.of(
                                    HashBasedTable::create,
                                    HashBasedTable::putAll,
                                    (a, b) -> {
                                        a.putAll(b);
                                        return a;
                                    }));
  )
Run Code Online (Sandbox Code Playgroud)

但我得到运行时异常"引起:java.lang.IllegalAccessError:尝试访问类com.google.common.collect.AbstractTable".

我们如何使用HashBasedTable作为Accumulator来收集ImmutablesTables,因为HashBasedTable用最新的条目覆盖现有条目,如果我们尝试放入重复条目并返回聚合的Immutable表,则不会失败.

Vác*_*žel 5

自Guava 21以来你可以使用ImmutableTable.toImmutableTable收藏家.

public ImmutableTable<Integer, String, Boolean> processList(List<String> strings) {
    return strings.stream()
            .map(this::processText)
            .flatMap(table -> table.cellSet().stream())
            .collect(ImmutableTable.toImmutableTable(
                    Table.Cell::getRowKey,
                    Table.Cell::getColumnKey,
                    Table.Cell::getValue,
                    (b1, b2) -> b1 && b2 // You can ommit merge function!
            ));
}

private ImmutableTable<Integer, String, Boolean> processText(String text) {
    return ImmutableTable.of(); // Whatever
}
Run Code Online (Sandbox Code Playgroud)