微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有Scala编译器选项使`Option[T](t).map(x => null)`返回None而不是Some(null)

如何解决是否有Scala编译器选项使`Option[T](t).map(x => null)`返回None而不是Some(null)

我有由 java 和 Scala 组成的企业多语言代码库。

我们有很多地方在 Option[T] 上执行映射函数,而映射函数是返回 null 的遗留代码

Option(2).map(x => null) 返回 Some(null)。当另一个高阶函数应用于结果时,它会抛出 NullPointerException。

作为一种解决方法,我们执行 Option[T](t).map(x => Option(mapping(x))) 以使此结果 None。它正在慢慢变成代码味道。

我想看看是否有更好的方法来做到这一点,或者当像这样的调用 None 自动进行时,Scala 编译器选项返回 Option[T](t).map(x => null)

解决方法

就我个人而言,我认为您的解决方法没有太大问题,因为您必须使用返回 null 的旧 API,但您必须像这样对其进行平面映射

Option(t).flatMap(x => Option(legacyJavaFunc(x)))

您可以投资一个 Scala 包装层来处理幕后的空值和异常,这样您就不必直接调用 Java API

// Scala API layer over Java API
def scalaFunc[T](t: T): Option[T] = Option(legacyJavaFunc(t))

// so we can avoid calling Java API directly
Option(t).flatMap(scalaFunc)

legacyJavaFunc 的执行发生在运行时,因此编译器无法在编译时提前预测结果以自动重写。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。