我对Scala很陌生,仍然试图理解它。 (我大多来自Java)。
我有一个关于我们永远不应该使用return语句的约定/规则的问题。
我有一个创建LabeledPoint对象的函数。最后一行创建LabeledPoint。它不是表达式,因此编译器认为应该返回前一行代码(作为一个单元)。但是,函数签名当然是返回LabeledPoint,ergo编译错误。
如果我添加一个return语句,一切都很好。
以下是代码:
@throws(classOf[Exception])
private def convertRowToLabeledPoint(rowIn: Row, fieldNameSeq: Seq[String], label:Int)
: LabeledPoint =
{
try
{
val values: Map[String, Integer] = rowIn.getValuesMap(fieldNameSeq)
val sortedValuesMap = ListMap(values.toSeq.sortBy(_._1): _*)
//println(s"convertRowToLabeledPoint row values ${sortedValuesMap}")
print(".")
val rowValuesItr: Iterable[Integer] = sortedValuesMap.values
var positionsArray: ArrayBuffer[Int] = ArrayBuffer[Int]()
var valuesArray: ArrayBuffer[Double] = ArrayBuffer[Double]()
var currentPosition: Int = 0
rowValuesItr.foreach
{
kv =>
if (kv > 0)
{
valuesArray += kv.doubleValue();
positionsArray += currentPosition;
}
currentPosition = currentPosition + 1;
}
val lp:LabeledPoint = new LabeledPoint(label, org.apache.spark.mllib.linalg.Vectors.sparse(positionsArray.size,positionsArray.toArray, valuesArray.toArray))
return lp
}
catch
{
case ex: Exception =>
{
throw new Exception(ex)
}
}
}
那么,我如何切换我的Java大脑并重塑(或分解)这个功能呢? 或者在这里使用return是否可以?
答案 0 :(得分:5)
最后一行应该是
new LabeledPoint(label, org.apache.spark.mllib.linalg.Vectors.sparse(positionsArray.size,positionsArray.toArray, valuesArray.toArray))
这就够了。 val lp:LabeledPoint = new LabeledPoint(..)
是赋值语句,因此编译器仍然期望返回类型
答案 1 :(得分:2)
替换
val lp:LabeledPoint = new LabeledPoint(label, org.apache.spark.mllib.linalg.Vectors.sparse(positionsArray.size,positionsArray.toArray, valuesArray.toArray))
return lp
与
new LabeledPoint(label, org.apache.spark.mllib.linalg.Vectors.sparse(positionsArray.size,positionsArray.toArray, valuesArray.toArray))
最后一个表达式是函数的返回值。
答案 2 :(得分:1)
或者,如果您想要lp
变量,例如用于调试,
val lp = ...
lp