Scala 斯卡拉:“我的朋友。”;切勿使用return语句“;但是

Scala 斯卡拉:“我的朋友。”;切勿使用return语句“;但是,scala,Scala,我对Scala还很陌生,仍在努力适应它。(我主要来自爪哇) 我有一个关于我们不应该使用return语句的约定/规则的问题 我有一个函数可以创建一个LabeledPoint对象。最后一行创建标签点。它不是一个表达式,因此编译器认为应该返回前一行代码(作为一个单元运行)。然而,函数签名当然是返回LabeledPoint,因此编译错误 如果我添加一个return语句,一切正常 代码如下: @throws(classOf[Exception]) private def convertRowToLabel

我对Scala还很陌生,仍在努力适应它。(我主要来自爪哇)

我有一个关于我们不应该使用return语句的约定/规则的问题

我有一个函数可以创建一个LabeledPoint对象。最后一行创建标签点。它不是一个表达式,因此编译器认为应该返回前一行代码(作为一个单元运行)。然而,函数签名当然是返回LabeledPoint,因此编译错误

如果我添加一个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可以吗?

替换

val lp:LabeledPoint = new LabeledPoint(label,  org.apache.spark.mllib.linalg.Vectors.sparse(positionsArray.size,positionsArray.toArray, valuesArray.toArray))

return lp

最后一个表达式是函数的返回值。

replace

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))

这就够了
val lp:LabeledPoint=new LabeledPoint(..)
是赋值语句,因此编译器仍然希望返回类型

最后一行应该是

new LabeledPoint(label,  org.apache.spark.mllib.linalg.Vectors.sparse(positionsArray.size,positionsArray.toArray, valuesArray.toArray))

这就够了
val lp:LabeledPoint=new LabeledPoint(..)
是赋值语句,因此编译器仍然需要返回类型

,或者,如果需要
lp
变量,例如用于调试

val lp = ...

lp

或者,如果您想要
lp
变量,例如用于调试

val lp = ...

lp