咨询Guava 15.0中TreeBasedTable出现{rowkey={}}空映射的复现方式
如何复现{rowkey={}}的输出
要得到这种日志输出,核心是让rowKey存在于Table的行集合中,但该行对应的列-值映射为空。在Guava 15.0的TreeBasedTable里,最直接的复现方式是调用row(rowKey)方法但不向返回的映射中添加任何内容:
import com.google.common.collect.TreeBasedTable; import com.google.common.collect.Table; public class TableDemo { public static void main(String[] args) { String targetRowKey = "myRow"; Table<String, String, String> table = TreeBasedTable.create(); // 关键操作:调用row()获取该行的映射,即使不添加任何列值对 table.row(targetRowKey); // 此时打印table就会输出 {myRow={}} System.out.println(table); } }
为什么这会生效?因为TreeBasedTable的row(K rowKey)方法设计是这样的:如果该行不存在,它会创建一个空的TreeMap并将其与rowKey绑定,加入到内部的行集合中。这个空映射不会自动被移除,所以当打印Table的toString时,就会出现{rowkey={}}的格式。
你之前尝试的put方法无法复现的原因:
- 传递
null作为行键/列键:TreeBasedTable依赖排序(底层用TreeMap),不允许null的行或列键,会抛出NullPointerException(而非编译错误,可能你的静态检查工具提前拦截了)。 put(rowkey, "", ""):会在该行添加一个列键为空字符串、值为空字符串的条目,所以打印时会显示{rowkey={=}},这是符合预期的正常输出。
什么时候TreeBasedTable.rowMap().get(rowKey)会返回空映射
只有一种明确场景:rowKey已被加入到Table的行集合中,但该行没有任何列-值映射。具体触发方式包括:
- 调用
table.row(rowKey)后,没有向返回的映射中添加任何条目(就是上面的复现代码逻辑)。 - 调用
table.row(rowKey).clear():如果该行之前有列-值对,清空后会留下空映射,此时rowMap().get(rowKey)返回空映射。
注意:如果通过put添加列值对后,再用remove(rowKey, columnKey)移除最后一个条目,TreeBasedTable会自动将该rowKey从行集合中移除,此时rowMap().get(rowKey)会返回null,而非空映射。
内容的提问来源于stack exchange,提问作者diksha agrawal
相关产品推荐
相关产品推荐

