添加if/else if条件后Scala类型不匹配

yquaqz18  于 2022-12-18  发布在  Scala
关注(0)|答案(1)|浏览(134)

很抱歉问了这个愚蠢的问题。我是Scala新手,不知道Scala是如何工作的。没有if /else if条件的代码工作得很好。但是当我添加if /else if条件时,它抱怨道:

ScoreTable.scala:172:10: type mismatch;
[error]  found   : Unit
[error]  required: String
[error]     else if ("test2".equalsIgnoreCase(adTypeInput)) {
[error]          ^

我应该如何修复它?Adjust private def method():私有def方法()的字符串:有吗?

private def method(): String = {
    val spark2 = spark
    import spark2.implicits._
    if ("test1".equalsIgnoreCase(adTypeInput)) {
    var table = (
        spark.read.parquet("path")
          ...
          ...
          .distinct()
      )
    table.select("propensity").summary().show(truncate = false)
    IOUtil.output(f"generate raw table with size: ${table.count()}")
    writeLocalTable(table)
   } else if("test2".equalsIgnoreCase(adTypeInput)) {
      spark.read.parquet("path")
      ...
      ...
    table.select("propensity").summary().show(truncate = false)
    IOUtil.output(f"generate raw table with size: ${table.count()}")
  }
wwtsj6pe

wwtsj6pe1#

Scala是面向表达式的。
Scala if(...) ... else ...不像Java if(...) {...} else {...},它更像是Java三元运算符... ? ... : ...,你可以把它的值赋给某个变量:

val x = if (...) ... else ...

在Scala中,每个块返回最后一个表达式。
所以在

if ("test1".equalsIgnoreCase(adTypeInput)) {
   ...
} else if("test2".equalsIgnoreCase(adTypeInput)) {
   ...
}

第一街区

var table = (
  spark.read.parquet("path")
    ...
    ...
  .distinct()
)
table.select("propensity").summary().show(truncate = false)
IOUtil.output(f"generate raw table with size: ${table.count()}")
writeLocalTable(table)


返回writeLocalTable(table)的值。我怀疑它是Unit
第二块

spark.read.parquet("path")
  ...
  ...
table.select("propensity").summary().show(truncate = false)
IOUtil.output(f"generate raw table with size: ${table.count()}")

返回IOUtil.output(...)的值。我怀疑它也是Unit
if-else的所有分支必须返回相同类型A的值,则整个if-else表达式返回类型A的值。
所以现在是Unit,但是在def method(): String = ...中你保证方法返回String,这是一个类型不匹配,也就是编译错误:found: Unit, required: String .
更改方法的签名:def method(): Unit = ...(但也有可能您必须更改调用method的位置,即仍然需要String的位置)或从每个分支返回一个String,如签名中所承诺的那样

if ("test1".equalsIgnoreCase(adTypeInput)) {
  ...
  writeLocalTable(table)
  "what string?"
} else if ("test2".equalsIgnoreCase(adTypeInput)) {
  ...
  IOUtil.output(...)
  "what string here?"
}

或者让if-else返回Unit,但从方法返回String

private def method(): String = {
  ...
  if ("test1".equalsIgnoreCase(adTypeInput)) {
    ...
  } else if ("test2".equalsIgnoreCase(adTypeInput)) {
    ...
  } else {
    // what if adTypeInput is neither "test1" nor "test2"? 
  }

  "what string to return?"
}

您应该查看在使用if-else进行更改之前返回了什么String

相关问题