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表,则不会失败.
自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)
| 归档时间: |
|
| 查看次数: |
2691 次 |
| 最近记录: |