返回Optional <Map <String,String >>的真正好处是什么,而不仅仅是一个空的Map <String,String>

ssg*_*gao 5 java optional java-8

如果我的代码Map<String, String>肯定会返回,但可能是空的.转换它是否有益处Optional<Map<String, String>>.它会为空但不是空实例添加任何好处吗?

Geo*_*ard 9

就像计算机编程中的许多科目一样,它取决于(tm).

我使用optional的方法是null的替代(简而言之).它的一个优点是它强制调用者认为可能没有返回值,并且这是一个有效的条件......考虑上面链接的答案中的引号:

没有值是比null更精确的公式

您的代码的任何读者或您的API的消费者都将遭受殴打,因为在访问该值之前可能没有任何内容并且需要进行检查.

所以当我看到返回类型签名时Optional<Map<String, String>>,我认为它是一个函数的返回类型,其中一个空Map可能是一个有效的返回值,但是完全缺少一个Map.

这样的示例包括getCachedFavoriteColors,findInvalidValuePairs等等.在前一种情况下,可能没有任何用户返回空Map- 但可能没有缓存值,这将返回无效Optional.在第二种情况下,可能没有任何无效的值对,这将再次返回空Map,但也可能没有Invalidator.你明白了.

请注意,在上面的某些情况下,您可能希望抛出异常而不是返回无效Optional.这是您作为API设计师的决定.

  • 但是(当然这个想法需要明智地应用于API设计):*Map*中缺少元素不同于*缺少Map*.后者是Optional,允许您以简洁的方式表达. (7认同)
  • 很难记住检查空映射和空映射,通常人们会忘记并最终抛出运行时错误.使用Optional,您可以将对null和空但初始化结构的检查压缩为一个单一检查.这就是我使用它们的方式,它确实使错误检查变得更加容易. (2认同)
  • @yshavit:你是否找到了有用的例子并不重要.重点在于,"只有当缺少元素和缺少地图之间存在区别时,它才有用",这已经足以帮助您的API设计.如果您从未遇到过这样的场景,那么在您的场景中没有使用"Optional <Map>". (2认同)