Scala:“永远不要使用return语句”但是

时间:2017-09-01 06:46:45

标签: scala

我对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是否可以?

3 个答案:

答案 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