gpt4 book ai didi

Guava 不可变表的 Java 8 收集器

转载 作者:行者123 更新时间:2023-12-02 13:25:04 28 4
gpt4 key购买 nike

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

收集结果,即合并所有结果并返回ImmutableTable。有办法实现吗?

当前实现(按照 Bohemian 的建议):

使用并行流怎么样?下面的代码有并发问题吗?使用并行流,我在 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(); }

下面的代码适用于流和并行流。但 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;
}));
)

但我收到运行时异常“由 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
}

关于Guava 不可变表的 Java 8 收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985659/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com