是否有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 的执行发生在运行时,因此编译器无法在编译时提前预测结果以自动重写。