Scala中Some、Option、Nonde的解释及使用案例
Scala中用类Option来表示某个变量可能为空的情况,它有两个子类,一个是Some,一个是None,如果一个变量A可能为空,可以将这个变量设置为Option[A],在用的时候进行判断,可以避免出现Null错误。
在实际中一般使用方式如下,假设某个方法可能需要一个参数,可以在当前类中设置一个set方法,用了set,这个参数就有值,那么执行一种情况,如果在调用该方法前,没有调用过set方法,那么这个参数为空执行另一种方法。我们来看一个实例,在spark的KMeans方法中,KMeans类定义了如下一个变量initialModel,它是Option[KMeansModel]类,用来保存载入已存在的模型或者是初始化类中心点的,可以存在也可以为空。在实际情况中,我们可能需要载入之前的KMeansModel实例或者是定义一个初始化的类中心,也可能是直接使用KMeans运行,前者需要先调用setInitialModel方法,后者不需要。那么前者情况下initialModel变量的结果是Some(model),后者是None,在执行算法的时候,KMeans需要先判断initialModel是否已经存在,若存在则使用之前的中心点,否则随机初始化:
private var initialModel: Option[KMeansModel] = None
def setInitialModel(model: KMeansModel): this.type = {
require(model.k == k, "mismatched cluster count")
initialModel = Some(model)
this
}
//运行的核心算法
private def runAlgorithm(
data: RDD[VectorWithNorm],
instr: Option[Instrumentation[NewKMeans]]): KMeansModel = {
... //之前的代码
/*****初始化类中心点,判断initialModel是Some(kMeansCenters)还是None,如果是前者,则调用kMeansCenters.clusterCenters的方法获取类中心点,否则则需要初始化类中心点,这里的kMeansCenters是随便定义的变量名,这里没有写类型,不重要,Some和initialModel一起就能确定这个变量的类型了。因而,它可以调用clusterCenters变量,它是属于KMeansModel下的变量。****/
val centers = initialModel是 match {
case Some(kMeansCenters) =>
kMeansCenters.clusterCenters.map(new VectorWithNorm(_))
case None =>
if (initializationMode == KMeans.RANDOM) {
initRandom(data)
} else {
initKMeansParallel(data)
}
}
val initTimeInSeconds = (System.nanoTime() - initStartTime) / 1e9
logInfo(f"Initialization with $initializationMode took $initTimeInSeconds%.3f seconds.")
... //之后的代码
}
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
