java - Guava 表的初始值

标签 java guava

我正在尝试使用 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 语句令人震惊。好的,

  1. 有没有更好的方法将迭代器转换为表,例如 FluentIterator?

  2. 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/

相关文章:

java - 从 Eclipse 运行时出现 SpringBoot : How to provide VM Argument in Spring Boot App,

java - 如何等待主线程直到AWS S3文件上传完成

java - Spring 中的资源服务器是否会在每个请求时调用授权服务器(Spring)?

java - 是否有 OSGi 版本的 Guava 源代码(用于 Eclipse)?

java - 使用 Spring IoC 在 Guava EventBus 中自动注册 beans

java - 如何在这款游戏中实现小而简单的图形?

java - 使用java注释和反射获取java.lang.NullPointerException

java - 如何使用 Google 的 Guava 库提取 Java 中的泛型类型

java - 保留 Guava SetMultimap 中的插入顺序

java - 从最频繁的 X 条目的多重集中获取有序子集