当前位置: 首页 > 面试题库 >

使用Guava MapMaker / CacheBuilder处理空值

鲁霄
2023-03-14
问题内容

我尝试使用MapMaker / CacheBuilder进行缓存,但是我不了解如何正确处理空值。

 ConcurrentMap<Key, Graph> graphs = new MapMaker()
       .concurrencyLevel(4)
       .weakKeys()
       .maximumSize(10000)
       .expireAfterWrite(10, TimeUnit.MINUTES)
       .makeComputingMap(
           new Function<Key, Graph>() {
             public Graph apply(Key key) {
               return createExpensiveGraph(key);
             }
           });

如果方法createExpensiveGraph返回空值,则抛出NullpointerException。我不明白为什么ComputingConcurrentHashMap抛出NPE而不是仅返回空值。

如何正确处理呢?只是捕获NPE并返回null即可?我想念什么吗?


问题答案:

Guava试图强迫您避免使用null任何可能的方法,因为在存在的情况下进行不正确或未记录的行为null可能会导致大量的混乱和错误。我认为,尽可能避免使用null绝对是一个好主意,如果可以修改代码以使其不使用null,我强烈建议您改用这种方法。

问题的答案主要取决于应用程序中“
null”值的实际含义。最有可能的是,这意味着此键“没有价值”,或“那里什么也没有”。在这种情况下,最好的选择是使用Optional,使用Optional.of
包装非null值,然后使用Optional.absent()代替null。如果必须将其转换为null或非null值,则可以使用Optional.orNull()



 类似资料:
  • 问题内容: 我有一段 一个如何在CSS中用空格表示id和class 当我使用 它不适用于以上的CSS。 问题答案: 实际上代表了两个不同的类 将不起作用,但您可能最终会获得实际的para编号

  • 问题内容: 我正在尝试创建一个程序,该程序扫描文本文件并将参数传递给子进程。一切正常,直到我得到路径中带有空格的目录。 我的split方法分解了参数,使它们跳越了空格: 可以,要么我需要函数来解析正确的参数,要么我将整个字符串传递给子进程而无需先对其进行分解。 不过我有点迷路了。 问题答案: 使用列表代替: 如果您的文件包含整个命令,而不仅仅是路径,那么您可以尝试shlex.split():

  • 在运行中,模板中的 空白 处理在某种程度上来说是纠缠所有模板引擎的一个问题。 我们来看这个模板。我已经用颜色标记了模板中的组件: 文本, 插值, FTL 标签.。 使用 [BR] 来想象 换行。 <p>List of users:[BR] <#assign users = [{"name":"Joe", "hidden":false},[BR] {

  • 我引用了irbanana关于支持PostGIS的空间数据类型的回答。我正在使用MySQL,并试图为自定义数据类型实现EWKBGeomPoint。 我的Gorm模型: 据我所知,MySQL支持这样的插入: 或 如果我使用自己的来满足的界面: 包括在内的整个值在Gorm的单引号中引用,因此它不起作用: 我如何让它工作? 编辑1: 我追踪Gorm代码,最终得到了的函数。在它内部检查且为真,则它进入调用,

  • 问题内容: 我有一个包含3列的表格:c1,c2和c3。我想编写一条select语句,以便如果c1和c2都为空,则显示c3,否则显示c1。 在上述情况下,编写select语句的最佳方法是什么? 问题答案: 使用案例 使用NVL2 或者 使用解码 易读性和易用性CASE胜出。

  • 我无法让JsonDeserializer处理空值。我正在读取一个json文件,其中我的记录类型只有四个值:Case 1、Case 2、*或null。JsonDeserializer可以很好地处理前3个。但是,遇到null时它似乎什么也做不了。根据代码(请参阅下面我的自定义反序列化器),我希望该行 要么抛出一个异常(从而将text = "NULL "赋值)。或者,根据返回一个空字符串 同样,我在这里