我正在尝试使用 Guava 进行练习,但遇到了一个问题,而且我对找到的解决方案感到不满意。
在我的情况下,我为每个用户和服务器设置了 id。尽管 Guava Table 进行了令人难以置信的简化,但我在构造表中的循环 if 语句 block
中仍然存在问题。
Table<Integer, Integer, Set> setPerUser = HashBasedTable.create();
for(Conversation conversation : conversations) {
Set uci = setPerUser.get(conversation.x, conversation.y);
if(uci == null) {
uci = new HashSet();
setPerUser.put(conversation.x, conversation.y, uci);
}
uci.add(conversation.id);
}
看来我的方向错了,if 语句令人震惊。好的,
有没有更好的方法将迭代器转换为表,例如 FluentIterator?
ThreadLocal、Guava Supplier 等有初值的方法,你怎么看?
谢谢
最佳答案
因为你在你的 Table
Cell
中存储了一个集合,你真正需要的是一个“Multitable”,它会根据需要自动为你创建集合(如 Multimap
可以)。我很确定这个要求非常复杂,超出了 Guava 团队愿意实现的范围。
我会说你正在做的是处理这种情况的最好方法(当然,除了你的 Set 应该是通用的之外)
这是一个静态工厂方法,它以更通用的方式执行您想要执行的操作:
public static <X, Y, Z, S extends Collection<Z>> void addCellValue(
Table<X, Y, S> table, X rowKey, Y colKey, Z value, Supplier<S> supplier) {
final S data;
if (table.contains(rowKey, colKey)) {
data = table.get(rowKey, colKey);
} else {
data = supplier.get();
table.put(rowKey, colKey, data);
}
data.add(value);
}
关于java - Guava 表的初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822800/